Rails 3——嵌套资源和多态路径:可以达到两层,但要达到三层就不行了



我正在尝试做一个简单的家庭团聚网站:"帖子","家庭","孩子"one_answers"图片"。理想情况下,我希望路由/关系是这样构建的:

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

在模型中,我在famskids之间设置了必要的"belongs_to"one_answers"has_many"关系。Fams, kids, posts都定义为""has_many :pictures, :as => :imageable",而图片定义为:belongs_to :imageable, :polymorphic => true

当试图在pictures视图中做link_to "Edit"link_to "Destroy"时,我遇到了各种_path问题。polymoric_path在两个级别上工作良好,即posts-picturesfams-pictures,但它无法处理fams-kids-pictures的三级情况。我猜它不是为了处理picture对象之上的两个级别的"imageable"对象而设计的。另一个问题是,在一个实例中,pictures控制器必须处理"一级"资源嵌套情况,而在另一个实例中,它必须处理"二级"情况。我不知道该怎么做

我所做的一件事是不嵌套资源超过一个深度,按照Ruby指南的指示。我这样组织它们:

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

这导致了另一组路径问题,因为家庭与孩子的关系不再被保留。我也无法得到多态路径在所有不同的picture视图中正确运行。

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

或者有人能告诉我如何为我的picture视图构建link_to EDITlink_to DELETE语句,以及redirect-to语句为我的pictures控制器中的create, updatedestroy方法?

谢谢!

将嵌套限制为2层的代码示例非常接近答案。为了避免fam ->kids和kids的路由重复,你可以使用:only选项和一个空白数组,这样第一级的kids将不会生成路由,除非在kids->图片的上下文中,像这样:

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)

已经有同样的问题一段时间了。我现在可以用了,但它不漂亮: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)) %>

任何让这个解决方案不那么粗略的建议都是非常受欢迎的:]

我不能为多态关联问题发言(可能需要更多关于实际错误的信息),但通过定义嵌套资源仅一层深度,您确实朝着正确的方向前进。这是Jamis Buck写的一篇很受欢迎的文章,已经成为一个参考,你可能应该去看看。

相关内容

  • 没有找到相关文章

最新更新