Cocoon 第一选项不保存 - 嵌套字段

Cocoon First Option Not Saving - Nested Fields

我将 Cocoon 用于嵌套表单,但是第一组字段没有保存到数据库中,如果我创建第二行它们似乎保存得很好?

我猜它只是我忽略的东西

class Form < ActiveRecord::Base
    has_many :questions
    accepts_nested_attributes_for :questions, :reject_if => :all_blank, :allow_destroy => true
end

class Question < ActiveRecord::Base
    belongs_to :form
end

----- form_controller.rb

def new
  @form = Form.new
  @form.questions.build
end 

def create
  @form = Form.new(form_params)

  if @form.save
     redirect_to action: "show", id: @form.id
  else
     render('new')
  end
end

def form_params
 params.require(:form).permit(:title, :description, :status, questions_attributes: [:form_id, :question_type, :question_text, :position,   :answer_options, :validation_rules, :done, :_destroy])
end

<%= simple_form_for Form.new ,:url => {:action => :create} do |f| %>
    <div class="section-row"> 
      <div class="section-cell">
        <%= f.label :title, "Form Title" %>
        <%= f.text_field :title, placeholder: "Form Title" %>
        <br/></br>
        <%= f.label :description, "Form Description" %>
        <%= f.text_area :description, placeholder: "Form Description" %>
        <%= f.hidden_field :status, value: "online" %>
      </div>
    </div>
    <div class="section-row"> 
      <div class="section-cell">
        <div id="questions">
          <%= simple_fields_for :questions do |question| %>
            <%= render 'question_fields', :f => question %>
            <%= link_to_add_association 'add question', f, :questions %>
          <% end %>
        </div>
      </div>
    </div>
    <div class="section-row"> 
      <div class="section-cell">
        <%= f.submit "Create Ticket", class: "btn btn-primary btn-lg" %>
      </div>
    </div>
  <% end %>

----_question_fields.html.erb

<div class='nested-fields'>
    <%= f.label :question_type, "Question Type" %>
    <%= f.select :question_type, 
options_for_select([['Text Box','textbox'],['Dropdown Options','select'],   ['Mutiple Choice','radio']], params[:question_type]),
{}, { :class => '' } %>
</div>

你在simple_fields_for里面写了link_to_add_association 您应该按如下方式编写表单(如文档所示):

<div id="questions">
<%= f.simple_fields_for :questions do |question| %>
 <%= render 'question_fields', f: => question %>
<% end %>
<div class="links">
 <%= link_to_add_association 'add task', f, :questions %>
</div>

您忘记了 simple_fields_for 前面的 f :那么 simple_fields_for 不知道表单,也不知道关联,因此它将命名传递给控制器不同,因此它会被您的强参数定义阻止。

所以如果你写

f.simple_fields_for :questions do |question|

它应该可以正常工作 ;)

较小的备注:

  • link_to_add_association 应该在循环之外,否则如果有 none 它将不可见,并且会为每个问题显示(这可能对您的意义有意义,也可能没有意义UI).
  • 您应该在 questions_attributes 的强参数中添加 id(对 editing/deleting 很重要)