我目前有:
class Tutorial
has_many :comments
end
class VideoTutorial < Tutorial
end
class Comments
belongs_to :tutorial
end
routes.rb
读起来像:
resources :tutorials do
resources :comments
end
我希望能够像这样引用特定类型的Tutorial
(以 开头VideoTutorial
):
/tutorials/1234
/tutorials/1234/comments/new
/tutorials/1234/comments/6374
Tutorial
这意味着尽可能多地处理教程,而不是VideoTutorial
(或出现的其他子类)。
我希望所有呼叫都转到单个控制器并使用上面的直接路由。
问题:现在发生了什么
我的表单似乎在多态上匹配路由,匹配特定Tutorial
实例的类型,例如
# @tutorial is a VideoTutorial
= form_for @tutorial do |f| # undefined method 'video_tutorial_path'
...
这很酷,但不是我在这种情况下要找的:)
我目前正在通过生成这些路线来使事情顺利进行:
resources :tutorials do
resources :comments
end
resources :video_tutorials, :controller => "tutorials" do
resources :comments
end
当出现新的子类时,我将指向Tutorials
控制器,因为我想避免大量控制器成倍增加Tutorial
。
但这变得混乱:
- 你会得到很多额外的路线
- 当您添加一个新的子类时,您会获得更多路线
Tutorial
- 您最终会引用参数,
:video_tutorial_id
而不仅仅是泛型:id
我想在上述情况下处理所有Tutorial
类型Tutorial
。
有什么更简单、更简洁的方法?
更新:根据@jdl 的建议
Tutorial
显示页面链接:
# original approach:
= link_to 'Show', @tutorial
# now:
= link_to 'Show', tutorial_path(@tutorial)
form_for
帮手:
# original approach:
= form_for @tutorial do |f|
# now:
= form_for @tutorial, :as => :tutorial, :url => tutorial_path do |f|
form_for
嵌套资源:
# original approach:
= form_for [@tutorial, @new_comment] do |f|
# now:
= form_for [@tutorial, @new_comment], :as => :tutorial, :url => tutorial_comments_path(@tutorial, @new_comment) do |f|
这现在按预期工作。
有点罗嗦:) 关于使它更优雅的任何进一步想法?