1

我目前有:

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|

这现在按预期工作。

有点罗嗦:) 关于使它更优雅的任何进一步想法?

4

1 回答 1

2

看一下:as参数form_for

http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

于 2012-09-17T01:17:30.290 回答