Изменить помощник URL для пути?

#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 , выдав исключение, когда оно равно нулю