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 很重要)
我将 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 很重要)