Rails 3 - 嵌套资源和多态路径:好到两个级别,但是在三个级别中断

时间:2011-05-07 00:34:26

标签: ruby-on-rails-3 polymorphic-associations belongs-to nested-routes

我正在尝试用一个简单的家庭聚会网站:“帖子”,“家庭”,“孩子”和“图片”。理想情况下,我希望以这种方式构建路线/关系:

  resources :posts do
    resources :pictures
  end

  resources :fams do
     resources :pictures
     resources :kids do
       resources :pictures
     end
  end

在模型中,我在belongs_tohas_many之间设置了必要的“fams”和“kids”关系。 Famskidsposts都定义为"has_many :pictures, :as => :imageable“,而图片定义为:belongs_to :imageable, :polymorphic => true

link_to "Edit"次观看中尝试link_to "Destroy"pictures时遇到各种_path问题。 polymoric_path在两个级别上工作正常,即posts-picturesfams-pictures,但它无法处理fams-kids-pictures的三级情况。我猜它不是为处理imageable对象上方的两个级别的“picture”对象而设计的。另一个问题是,在一个实例中,pictures控制器必须处理“一级”资源嵌套情况,而在另一个实例中,它必须处理“两级”情况。不知道如何处理这个问题。

根据Ruby Guides的说明,我尝试过的一件事就是不要将资源嵌套到一个以上。我把它们组织成这样:

  resources :posts do
    resources :pictures
  end

  resources :fams do
     resources :pictures
     resources :kids
  end

  resources :kids do
     resources :pictures
  end

这引起了路径的另一组问题,因为不再保留fam与kid之间的关系。我也无法使polymorphic_path在所有不同的picture视图中正确运行。

所以这是我的主要问题:有没有人知道Rails 3示例/教程,其中嵌套资源,属于/ has_many和多态关系都被放在一起,特别是在它不仅仅是简单的两级大多数例子显示的关系? (我对Rails相当新,我在这些领域找到的Rails 2例子因为我缺乏Rails的历史经验而令人困惑。)

或者有人可以告诉我如何构建link_to EDIT次观看的link_to DELETEpicture语句,以及我redirect-to的{​​{1}}语句我create控制器中的updatedestroy方法?

谢谢!

3 个答案:

答案 0 :(得分:7)

您的嵌套限制为2级的代码示例非常接近答案。为了避免重复路线为fams->孩子和孩子,你可以使用:only选项与空白数组,以便第一级孩子不会生成路线,除了在孩子 - >图片的上下文,如下所示: / p>

resources :posts do
  resources :pictures
end

resources :fams do
  resources :pictures
  resources :kids
end

resources :kids, only: [] do # this will not generate kids routes
   resources :pictures
end

对于上面的代码,您可以使用以下内容构建多态编辑URL:

polymorphic_url([fam, picture], action: :edit) # using Ruby 1.9 hash syntax
polymorphic_url([kid, picture], action: :edit)

答案 1 :(得分:2)

一段时间以来一直有这个完全相同的问题。我现在有工作,但它不漂亮:S

来自嵌套怪物:

http://localhost:3000/destinations/3/accommodations/3/accommodation_facilities/52

您的参数对象最终看起来像这样:

action: show
id: "52"
destination_id: "3"
accommodation_id: "3"
controller: accommodation_facilities

其中“id”表示当前模型id(链上的最后一个),其他的具有model_name_id

要在此页面上正确呈现另一个嵌套链接,您需要传入构成完整路径的对象数组,例如链接到您必须执行的虚构FacilityType对象:

 <%= link_to "New", new_polymorphic_path([@destination, @accommodation, @accommodation_facility, :accommodation_facility_type]) %>

要从params对象生成此数组,我在application_helper.rb

中使用此代码
def find_parent_models(current_model = nil)
    parents = Array.new

    params.each do |name, value|
      if name =~ /(.+)_id$/
        parents.push $1.classify.constantize.find(value)
      end
    end

    parents.push current_model

    parents
end

然后自动创建相同的链接,你可以愉快地做:

 <%= link_to "New", new_polymorphic_path(find_parent_models(@accommodation_facility).push(:accommodation_facility_type)) %>

非常欢迎任何关于使这个解决方案不那么粗略的指示:]

答案 2 :(得分:0)

我不能代表多态关联问题(可能需要更多关于实际错误的信息)但是你确实通过定义只有一层深度的嵌套资源来朝着正确的方向前进。这是Jamis Buck的popular article,它已成为参考,您应该查看。