我的应用程序中的一些伪代码:
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
直到明天我才能尝试代码,但是当我到达时,我会更好地睡觉,因为我可以解决这个问题。
答案 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
调用循环遍历集合中该类型的每个对象。