Используя полиморфные пути с вложенными ассоциациями

У меня есть полиморфная ассоциация, которая похожа на это:

class Line < ActiveRecord::Base
   belongs_to :item, :polymorphic => true
end

class Education < ActiveRecord::base
   has_many :lines, :as => :item
end

class Work < ActiveRecord::base
   has_many :lines, :as => :item
end

Я хотел бы простой способ создать новую строку из родительского элемента. Так, я мог бы редактировать представление для объекта Работы, и хотеть иметь ссылку, которая создает объект новой строки. Обычно, я сделал бы это:

<%= link_to "New Line", new_work_line_path(@work) %>

И помощник работал бы маршрут на это. Однако это требует, чтобы я проверил, какому родителю Строка принадлежит в контроллере, побеждая цель полиморфизма (я, возможно, использовал две ссылки, если это имело место). Так, мой вопрос, как я заставляю путь работать полиморфно как помощник обычного тракта?

13
задан Ciro Santilli 新疆改造中心法轮功六四事件 1 September 2014 в 20:43
поделиться

1 ответ

Возможным способом может быть использование таких маршрутов:

map.resources :works do |works|
  works.resources :lines
end

map.resources :educations do |edu|
  edu.resources :lines
end

Ваш LinesController останется прежним, и вы получите такие маршруты:

work_lines GET    /works/:work_id/lines
....
education_lines GET    /educations/:education_id/lines
...

Самая раздражающая часть - это управление первый идентификатор передан, потому что у вас будет params [: id] , относящийся к строке, но у вас также будет params [: work_id] или params [: education_id] . Здесь вы должны выбрать между проверкой того, какой параметр передан, или, по крайней мере, проанализировать запрошенный URL, чтобы определить, в каком вы находитесь (работы, образование и т. Д.).

Надеюсь, это помогло;)

РЕДАКТИРОВАТЬ:

Согласно тому, что появилось в комментариях, вы можете использовать polymorphic_url / polymorphic_path ( http: // api .rubyonrails.org / classes / ActionDispatch / Routing / PolymorphicRoutes.html ):

Имеет смысл, если вы используете их таким образом:

link_to "New Line", polymorphic_url(@line.item,@line)
# => /<educations_or_works>/item_id/lines/line_id

По крайней мере, вы даже можете использовать его для коллекций:

link_to "New Line", polymorphic_url(@line.item,Line.new)
# => /<educations_or_works>/item_id/lines/

С уважением,
а.

7
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: