Использование полиморфных путей с вложенными ассоциациями - PullRequest
13 голосов
/ 30 июня 2010

У меня есть полиморфная ассоциация, которая выглядит так:

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

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

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

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

1 Ответ

7 голосов
/ 30 июня 2010

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

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/

Cheers,
a.

...