使用'接受嵌套属性'与'属于'关系的Rails

时间:2013-09-08 01:49:10

标签: ruby-on-rails

我的应用程序中的一些伪代码:

User has many Products
User has many Projects
Project and Product belong to User

此外:

Project has one Video
Video belongs to Project

我有一个使用Wicked gem构建的多步向导。在第一步中,我创建并保存了一个项目。在第二步中,我向该项目添加了一个视频:

= form_for @project do |f|
  = f.fields_for :video_attributes do |v|
    = v.file_field :file

一切正常,但我想在同一步骤中向项目用户添加产品。关于嵌套属性如何适用于这类事情,我有点困惑。

我想我需要在邪恶的控制器中做这样的事情:

@user = current_user
# wicked makes us use :project_id as it hijacks :id
@project = @user.projects.find(params[:project_id])
@user.products.build

但是我在哪里坚持'嵌套属性'来电话?我需要多次调用accepts_nested_attributes_for吗?这会有用吗?

Make Project model accept nested attributes for User
Make User model accept nested attributes for Product

= form_for @product do |f|
  = f.fields_for :user_attributes do |u|
    = u.fields_for :product_attributes do |p|
      = p.file_field :image

直到明天我才能尝试代码,但是当我到达时,我会更好地睡觉,因为我可以解决这个问题。

1 个答案:

答案 0 :(得分:1)

你当然可以通过嵌套fields_for调用来扩展嵌套属性到几个对象......但是如果你在对象之间来回跳跃,有时看起来像是朝向这里,你有时会遇到麻烦。由于这样的结构导致循环保存问题,我遇到了问题。因此,我建议将accepts_nested_attributes_for保留为单行道。因此,如果用户accept_nested_attributes_for项目,那么项目也不应该为users_ented_attributes_for用户。鉴于此,您的表单必须基于根对象构建。我不知道你的项目,但对我的用户而言。基本上,用户更可能是中心关系。希望这会有所帮助。

此外,我不确定您的fields_for来电使用<some object>_attributes的原因。除非你做一些特别的事情,否则那些应该是f.fields_for :video之类的关系。这样,fields_for调用循环遍历集合中该类型的每个对象。