Как я могу изменить имена параметров по умолчанию в Rails 3 маршрутизации? - PullRequest
6 голосов
/ 22 марта 2011

В моем проекте Rails 3 у меня есть список таких маршрутов:

resources :projects do
    resources :studies
end

resources :sticky_notes
resources :study_templates

...

В настоящее время по умолчанию идентификаторы в URL-адресах этих маршрутов можно вызывать с помощью params [: id], но я хочучтобы можно было вызывать их с помощью params [: sticky_note_id], params [: study_template_id], params [: study_id] и т. д. Можно ли указать имя параметра для идентификатора этих проектов?Должен ли я выписывать каждый маршрут вручную без «ресурсов»?

Спасибо!

Редактировать: Вот пример того, что я пытаюсь сделать: Вот что происходит, когда маршрутыопределяется как написано выше:

resources :projects do
    resources :studies
end
# results in /projects/:project_id/studies/:id
# /projects/:project_id/studies/:id/edit
# /projects/:project_id/studies/:id/new
# etc.

resources :sticky_notes
# results in /sticky_notes/:id
# /sticky_notes/:id/edit
# /sticky_notes/:id/new
# etc.

Это то, что я хочу:

match '/projects/:project_id/studies/:study_id' => 'studies#show'
match '/projects/:project_id/studies/:study_id/edit' => 'studies#edit'
match '/projects/:project_id/studies/:study_id/new' => 'studies#new'
...

# results in /projects/:project_id/studies/:study_id
# /projects/:project_id/studies/:study_id/edit
# etc

match '/sticky_notes/:sticky_note_id' => 'sticky_notes#show'
match '/sticky_notes/:sticky_note_id/edit' => 'sticky_notes#edit'
match '/sticky_notes/:sticky_note_id/new' => 'sticky_notes#new'
...

# results in /sticky_notes/:sticky_note_id
# /sticky_notes/:sticky_note_id/edit
# etc

Я хочу вторую часть, но без всей этой работы над моим уже огромным файлом маршрутов.:) это возможно?

1 Ответ

0 голосов
/ 22 марта 2011

после того, как 'rout.rb' - это просто простой файл ruby, так почему бы не использовать код ruby ​​и, возможно, даже создать метод для генерации необходимых маршрутов. Давайте рассмотрим простой пример с использованием массива ресурсов,если вы хотите использовать вложенные ресурсы, вы можете изменить метод для использования хэш-цепочек, чтобы передать ресурсы, которые вы хотите добавить:

def add_nested_resource(toadd=nil, controller=nil, resources=[])
  return if toadd.nil? || controller.nil? || ressources.empty?
  resources.each { |x|
    resources x do
      resources toadd, :controller => controller
    end
  }
end

add_nested_resource(:notes, "notes", [:resource1, :resource2, ..., :resourceX]

будет эквивалентно

resources :resource1 do
  resources :notes, :controller => "notes"
end
resources :resource2 do
  resources :notes, :controller => "notes"
end
.
.
.
resources :resourceX do
  resources :notes, :controller => "notes"
end

Таким образом, вы можете просто написать множество маршрутов без особых усилий.Конечно, в notes_controller вам, возможно, придется различать, какой ресурс вызвал его, я обычно добавляю скрытое поле в соответствующие формы, где я оставляю «секретное» имя объекта, который вложен во вложенный объект ... как

<%= form_for ... someform for resource1... do |f| %> 
 ...
 <%= hidden_field_tag :nesting_object, "Resource1" %>
 ...
<% end %>

Надеюсь, это поможет вам справиться с трудностями ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...