【问题标题】:Rails - Cocoon gem - Nested FormsRails - Cocoon gem - 嵌套表单
【发布时间】:2016-04-04 23:55:09
【问题描述】:

我正在尝试使用 Rails 4 制作应用程序。

我将简单的表单 gem 用于表单,并尝试将 Cocoon gem 用于表单的嵌套元素。

我问了这个问题,它更详细地解释了我想要实现的目标:Rails - Multiple entries for a single attribute

我有一个档案模型和一个资格模型。这些关联是:

profile.rb

has_many :qualifications  
    accepts_nested_attributes_for :qualifications,  reject_if: :all_blank, allow_destroy: true

资格.rb

belongs_to :profile

profiles 控制器在强参数中包含资格属性:

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>      

我注释掉了删除链接,因为按原样,我收到了这个错误:

undefined method `new_record?' for nil:NilClass

我对 Rails 报告错误的方式感到困惑——我很少理解这种风格的错误消息,但我认为这与没有任何条件可以删除有关。茧会处理这个吗?

当我将其注释掉并重试时,我在添加关联的链接中收到此错误:

undefined method `object' for #<Hash:0x007fe70c501ea0>

我也不知道这条消息是什么意思。

因此,按照 Cocoon gem 文档中的步骤进行操作,(由于我不知道如何在 haml 中编写内容而进行了更改;并更改了表达式的形式以引用表单构建器 'f: f'我的其他表格,所以我猜测文档中显示的表达式可能与haml有关),我在这个阶段有2个错误:

  1. 添加关联 - 未定义的方法对象
  2. 删除关联 - 未定义的方法 `new_record?

我很难理解这里发生了什么。

接受杰万的建议:

我将个人资料表格更改为:

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

【问题讨论】:

    标签: ruby-on-rails nested-forms nested-attributes cocoon-gem


    【解决方案1】:
    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。此部分用于呈现一个不同关联对象的字段。当您单击“添加资格”或您的父对象已经具有一些资格时,它会显示。 simple_fields_for :qualifications 应该放在您的个人资料表格中,并包含render 'qualifications/qualifications_fields', f: flink_to_add_association ...。考虑这个例子:https://github.com/nathanvda/cocoon#simpleform

    【讨论】:

    • 嗨 - 我试过这个,但得到了同样的错误。上面粘贴的输出。
    • 仅供参考,我还尝试将“'”移动到 f:f 之后,如您所示,但是当我尝试这样做时出现此错误:部分名称(qualifications/qualification_fields,f:f ) 不是有效的 Ruby 标识符;确保您的部分名称以下划线开头,后跟字母、数字和下划线的任意组合。
    • 对不起,这是一个错字,不应移动引用。这是您的代码中的另一个问题:simple_fields_for 应该是 f.simple_fields_for。这应该可以解决 undefined method 'new_record?' 的错误。
    • 谢谢。当我尝试这样做时,个人资料表格会加载,但会跳过部分资格表格和添加新资格的链接。它只是从资格标题到表单下一部分中的下一个标题。
    • 这是因为个人资料没有资格,所以没有显示字段。您需要在控制器操作中调用@profile.qualifications.build,在这种情况下,配置文件将始终具有空且未持久的限定条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多