0

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

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

直到明天我才能尝试代码,但我会睡得更好,因为我知道当我得到它时我可以解决这个问题。

4

1 回答 1

1

您当然可以通过嵌套调用来通过多个对象扩展嵌套属性fields_for......但是如果您在对象之间来回跳转,就像您正在前往这里一样,您有时会遇到麻烦。我遇到了类似结构导致的循环保存问题。出于这个原因,我建议将其保留accepts_nested_attributes_for为单向街道。因此,如果用户接受_nested_attributes_for 项目,那么项目不应该也接受_nested_attributes_for 用户。鉴于此,您的表单必须基于根对象构建。我不知道你的项目,但对我来说那是用户。基本上,用户更有可能成为中心关系。希望这可以帮助。

另外,我不确定您的fields_for电话为什么使用<some object>_attributes. 除非您正在做一些特别的事情,否则那些应该是关系名称,例如f.fields_for :video. 这样,fields_for调用将遍历集合中该类型的每个对象。

于 2013-09-08T02:27:02.910 回答