Rails - 茧 gem - 嵌套表格
Rails - Cocoon gem - Nested Forms
我正在尝试用 Rails 4 制作一个应用程序。
我对表单使用简单表单 gem,并尝试对表单的嵌套元素使用 Cocoon gem。
我问了这个问题,它更详细地解释了我想要实现的目标:
我有个人资料模型和资格模型。这些协会是:
profile.rb
has_many :qualifications
accepts_nested_attributes_for :qualifications, reject_if: :all_blank, allow_destroy: true
qualification.rb
belongs_to :profile
配置文件控制器在强参数中包含资格属性:
def profile_params
params[:profile].permit(:user_id, :title, :hero, :overview, :research_interest, :occupation, :external_profile,
:working_languages, :tag_list,
qualifications_attributes: [:id, :level, :title, :year_earned, :institution, :_destroy] )
end
我的个人资料表格现在有:
<div class="intpol2">
Your qualifications
</div>
<%= render 'qualifications/qualification_fields', f: f %>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_add_association 'Add a qualification', f: f, partial: 'qualifications/qualification_fields' %>
</div>
我的资格部分表格现在在我的资格视图文件夹中命名为 _qualifications_fields.html.erb
<div class="nested-fields">
<div class="container-fluid">
<%= simple_fields_for :qualifications do |f| %>
<div class="form-inputs">
<div class="row">
<div class="col-md-6">
<%= f.input :title, :label => "Your award" %>
</div>
<div class="col-md-6">
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
</div>
<div class="col-md-6">
<%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
</div>
</div>
<div class="row">
<div class="col-md-6">
<!-- link_to_remove_association 'Remove this qualification', f, :f -->
</div>
</div>
</div>
<% end %>
</div>
</div>
我注释掉了删除 link,因为原样,我得到了这个错误:
undefined method `new_record?' for nil:NilClass
我对 Rails 报告错误的方式感到困惑 - 我很少理解这种风格的错误消息,但我认为这与没有任何资格删除有关。 Cocoon 会处理这个吗?
当我将其注释掉并重试时,我收到此错误消息 link 添加关联:
undefined method `object' for #<Hash:0x007fe70c501ea0>
我也不知道这条消息是什么意思。
因此,按照 Cocoon gem 文档中的步骤,(有一些更改,因为我不知道如何在 haml 中编写内容;并更改表达式的形式以引用表单构建器 'f: f' 适用于我的其余表单,所以我猜测文档中显示的表达式可能与 haml 有关),我在这个阶段有 2 个错误:
- 添加关联 - 未定义的方法对象
- 删除关联 - 未定义的方法`new_record?
我很难理解这里发生了什么。
采纳 JEIWAN 的建议:
我将个人资料表格更改为:
<%= simple_form_for @profile, html: { multipart: true } do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="row">
<div class="intpol2">
Your professional qualifications
</div>
<%= simple_fields_for :qualifications do |f| %>
<%= render 'qualifications/qualification_fields', f: f %>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_add_association 'Add a qualification', f, :qualifications, partial: 'qualifications/qualification_fields' %>
<% end %>
</div>
</div>
<div class="form-actions">
<%= f.button :submit, "Submit", :class => 'formsubmit' %>
</div>
<% end %>
</div>
</div>
</div>
我将资格字段表格更改为:
<div class="nested-fields">
<div class="container-fluid">
<div class="form-inputs">
<div class="row">
<div class="col-md-6">
<%= f.input :title, :label => "Your award" %>
</div>
<div class="col-md-6">
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
</div>
<div class="col-md-6">
<%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_remove_association 'Remove this qualification', f %>
</div>
</div>
</div>
</div>
</div>
当我保存并重试时,我得到这个错误:
undefined method `new_record?' for nil:NilClass
错误消息突出显示了这一行:
<%= link_to_remove_association 'Remove this qualification', f %>
link_to_add_association 'Add a qualification', f: f, partial: 'qualifications/qualification_fields'
f: f
此处不正确。第二个参数应该是一个表单生成器(只是一个对象,而不是散列)和第三个参数——关联的名称,即 :qualifications
在你的例子中。所以它应该是这样的:
link_to_add_association 'Add a qualification', f, :qualifications, partial: 'qualifications/qualification_fields'
这里:
link_to_remove_association 'Remove this qualification', f, :f
:f
也是错误的。这里的第三个参数是 HTML 选项。如果你不需要它们,那么只需指定 2 个参数:
link_to_remove_association 'Remove this qualification', f
接下来,_qualification_fields.html.erb
不应包含 simple_fields_for
。此部分用于呈现一个不同关联对象的字段。当您单击 'Add a qualification' 或当您的父对象已经具有某些限定条件时,它会显示。 simple_fields_for :qualifications
应放在您的个人资料表格中,并包含 render 'qualifications/qualifications_fields', f: f
和 link_to_add_association ...
。考虑这个例子:https://github.com/nathanvda/cocoon#simpleform
我正在尝试用 Rails 4 制作一个应用程序。
我对表单使用简单表单 gem,并尝试对表单的嵌套元素使用 Cocoon gem。
我问了这个问题,它更详细地解释了我想要实现的目标:
我有个人资料模型和资格模型。这些协会是:
profile.rb
has_many :qualifications
accepts_nested_attributes_for :qualifications, reject_if: :all_blank, allow_destroy: true
qualification.rb
belongs_to :profile
配置文件控制器在强参数中包含资格属性:
def profile_params
params[:profile].permit(:user_id, :title, :hero, :overview, :research_interest, :occupation, :external_profile,
:working_languages, :tag_list,
qualifications_attributes: [:id, :level, :title, :year_earned, :institution, :_destroy] )
end
我的个人资料表格现在有:
<div class="intpol2">
Your qualifications
</div>
<%= render 'qualifications/qualification_fields', f: f %>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_add_association 'Add a qualification', f: f, partial: 'qualifications/qualification_fields' %>
</div>
我的资格部分表格现在在我的资格视图文件夹中命名为 _qualifications_fields.html.erb
<div class="nested-fields">
<div class="container-fluid">
<%= simple_fields_for :qualifications do |f| %>
<div class="form-inputs">
<div class="row">
<div class="col-md-6">
<%= f.input :title, :label => "Your award" %>
</div>
<div class="col-md-6">
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
</div>
<div class="col-md-6">
<%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
</div>
</div>
<div class="row">
<div class="col-md-6">
<!-- link_to_remove_association 'Remove this qualification', f, :f -->
</div>
</div>
</div>
<% end %>
</div>
</div>
我注释掉了删除 link,因为原样,我得到了这个错误:
undefined method `new_record?' for nil:NilClass
我对 Rails 报告错误的方式感到困惑 - 我很少理解这种风格的错误消息,但我认为这与没有任何资格删除有关。 Cocoon 会处理这个吗?
当我将其注释掉并重试时,我收到此错误消息 link 添加关联:
undefined method `object' for #<Hash:0x007fe70c501ea0>
我也不知道这条消息是什么意思。
因此,按照 Cocoon gem 文档中的步骤,(有一些更改,因为我不知道如何在 haml 中编写内容;并更改表达式的形式以引用表单构建器 'f: f' 适用于我的其余表单,所以我猜测文档中显示的表达式可能与 haml 有关),我在这个阶段有 2 个错误:
- 添加关联 - 未定义的方法对象
- 删除关联 - 未定义的方法`new_record?
我很难理解这里发生了什么。
采纳 JEIWAN 的建议:
我将个人资料表格更改为:
<%= simple_form_for @profile, html: { multipart: true } do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="row">
<div class="intpol2">
Your professional qualifications
</div>
<%= simple_fields_for :qualifications do |f| %>
<%= render 'qualifications/qualification_fields', f: f %>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_add_association 'Add a qualification', f, :qualifications, partial: 'qualifications/qualification_fields' %>
<% end %>
</div>
</div>
<div class="form-actions">
<%= f.button :submit, "Submit", :class => 'formsubmit' %>
</div>
<% end %>
</div>
</div>
</div>
我将资格字段表格更改为:
<div class="nested-fields">
<div class="container-fluid">
<div class="form-inputs">
<div class="row">
<div class="col-md-6">
<%= f.input :title, :label => "Your award" %>
</div>
<div class="col-md-6">
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :level, collection: [ "Bachelor's degree", "Master's degree", "Ph.D", "Post Doctoral award"] %>
</div>
<div class="col-md-6">
<%= f.input :year_earned, :label => "When did you graduate?", collection: (Date.today.year - 50)..(Date.today.year) %>
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= link_to_remove_association 'Remove this qualification', f %>
</div>
</div>
</div>
</div>
</div>
当我保存并重试时,我得到这个错误:
undefined method `new_record?' for nil:NilClass
错误消息突出显示了这一行:
<%= link_to_remove_association 'Remove this qualification', f %>
link_to_add_association 'Add a qualification', f: f, partial: 'qualifications/qualification_fields'
f: f
此处不正确。第二个参数应该是一个表单生成器(只是一个对象,而不是散列)和第三个参数——关联的名称,即 :qualifications
在你的例子中。所以它应该是这样的:
link_to_add_association 'Add a qualification', f, :qualifications, partial: 'qualifications/qualification_fields'
这里:
link_to_remove_association 'Remove this qualification', f, :f
:f
也是错误的。这里的第三个参数是 HTML 选项。如果你不需要它们,那么只需指定 2 个参数:
link_to_remove_association 'Remove this qualification', f
接下来,_qualification_fields.html.erb
不应包含 simple_fields_for
。此部分用于呈现一个不同关联对象的字段。当您单击 'Add a qualification' 或当您的父对象已经具有某些限定条件时,它会显示。 simple_fields_for :qualifications
应放在您的个人资料表格中,并包含 render 'qualifications/qualifications_fields', f: f
和 link_to_add_association ...
。考虑这个例子:https://github.com/nathanvda/cocoon#simpleform