#ruby-on-rails-3 #routing
#ruby-on-rails-3 #маршрутизация
Вопрос:
У меня есть следующий фрагмент кода, который я пытаюсь вписать в некоторые сгенерированные строительные леса
= form_for(@event, :url => group_event_path(@event.group_id, @event) ) do |f|
Как вы можете видеть, я определил маршрут вложенных ресурсов, который выглядит следующим образом
resources :groups do
resources :events
end
Теперь вернемся к строке form_for выше. Каркас Rails по умолчанию использует код, аналогичный приведенному выше, для создания _form, который используется в #new и #edit . Проблема, с которой я сталкиваюсь, заключается в том, что form_for должен подчиняться этим двум путям
- СОЗДАТЬ: group_events_path(@event.group_id)
- ОБНОВЛЕНИЕ: group_event_path(@event.group_id, @event)
Есть ли способ упростить это, изменив способ работы помощников group_event (ов) _path?
Ответ №1:
Если вы используете полиморфный form_for
синтаксис, это исправит это:
= form_for([@group, @event]) do |f|
Теперь, если этот @event
объект сохраняется в базе данных, он будет использовать update
маршрут, а если нет, то он будет использовать create
маршрут.
Вы можете сделать то же самое с обычным form_for
вызовом:
= form_for(@event) do |f|
Нет абсолютно никаких причин указывать :url
параметр, отличный от настройки URL, чтобы он отличался от того, что указывает Rails.
Комментарии:
1. Первый подход пришел мне в голову, но мне показалось излишним выполнять второй поиск в базе данных только для этой одной строки. Я думаю, это преждевременная оптимизация. В идеале я хотел бы сопоставить второй подход, чтобы просто построить путь, просмотрев
@event.group_id
, выдав исключение, когда оно равно нулю