9

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

  resources :posts do
    resources :pictures
  end

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

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

在尝试做的时候link_to "Edit"link_to "Destroy"pictures视图中我遇到了各种各样的_path问题。 polymoric_path在两个级别上都可以正常工作,即 forposts-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

由于不再保留家庭与孩子的关系,这导致了另一组路径问题。我也无法让 polymorphic_path 在所有不同的picture视图中正确运行。

所以这是我的主要问题:有谁知道 Rails 3 示例/教程,其中嵌套资源、属于/has_many 和多态关系都放在一起,尤其是在它不仅仅是最简单的两级关系的地方举例说明?(我对 Rails 还很陌生,鉴于我缺乏 Rails 历史经验,我在这些领域发现的 Rails 2 示例令人困惑。)

或者有人可以告诉我如何构造我的视图的link_to EDITandlink_to DELETE语句,以及我的控制器 中的 my ,和方法的语句吗?pictureredirect-tocreateupdatedestroypictures

谢谢!

4

3 回答 3

7

您将嵌套限制为 2 级的代码示例非常接近答案。为避免fams->kids 和kids 的重复路线,您可以使用带有空白数组的:only 选项,这样第一级kids 将不会生成路线,除非是在kids->pictures 的上下文中,如下所示:

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)
于 2011-07-21T08:00:39.150 回答
2

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

来自嵌套的怪物,例如:

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

你的params对象最终看起来像这样:

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)) %>

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

于 2011-07-20T09:46:55.223 回答
0

我不能说多态关联问题(可能需要有关实际错误的更多信息),但通过将嵌套资源定义为仅一层深,您确实朝着正确的方向前进。这是 Jamis Buck 的一篇热门文章,已成为参考,您可能应该查看一下。

于 2011-05-07T00:43:09.983 回答