我尝试使用form_for
和fields_for
制作嵌套表单。经过大量的研究和成功,不再在我的项目上工作了。我只是想重新创建一个railscast,看看我做错了什么。
我试图重新创建在http://railscasts.com/episodes/196-nested-model-form-part-1找到的示例,因为代码在那里不应该那么难,但我无法设法从调查。这是我的代码,直到现在:
rails new surveysays
rails g scaffold survey name:string
rake db:migrate
rails g scaffold question survey_id:integer content:text
rake db:migrate
我尝试按照完全相同的视频序列进行操作。 我的问题模型:
class Question < ActiveRecord::Base
belongs_to :survey
end
我的调查模型:
class Survey < ActiveRecord::Base
has_many :questions, dependent: :destroy
accepts_nested_attributes_for :questions
end
我的调查表包含嵌套问题字段:
<%= form_for(@survey) do |f| %>
...
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%= f.fields_for :questions do |builder| %>
<p>
<%= builder.label :content, "Question" %><br/>
<%= builder.text_area :content, :row => 3 %>
</p>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我的调查显示:
<p id="notice"><%= notice %></p>
<p>
<strong>Name:</strong>
<%= @survey.name %>
</p>
<ol>
<% for question in @survey.questions %>
<li><%=h question.content%></li>
<% end %>
</ol>
<%= link_to 'Edit', edit_survey_path(@survey) %> |
<%= link_to 'Back', surveys_path %>
我的SurveysController:
class SurveysController < ApplicationController
...
# GET /surveys/new
def new
@survey = Survey.new
3.times { @survey.questions.build }
end
...
# POST /surveys
# POST /surveys.json
def create
@survey = Survey.new(survey_params)
respond_to do |format|
if @survey.save
format.html { redirect_to @survey, notice: 'Survey was successfully created.' }
format.json { render :show, status: :created, location: @survey }
else
format.html { render :new }
format.json { render json: @survey.errors, status: :unprocessable_entity }
end
end
end
...
private
# Use callbacks to share common setup or constraints between actions.
def set_survey
@survey = Survey.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def survey_params
params.require(:survey).permit(:name)
end
end
直到分钟5:34,当它没有像视频中所示那样工作并且没有创建问题时,表格会显示3个问题,我填写表格,但是当按创建它不会创建问题:
加载开发环境(Rails 4.1.6) 2.1.3:001&gt; s = Survey.all 调查负荷(3.0ms)SELECT&#34;调查&#34;。* FROM&#34;调查&#34; =&GT; #]&GT; 2.1.3:002&gt; q = s [0] .questions 问题负载(0.6ms)SELECT&#34;问题&#34;。* FROM&#34;问题&#34;问题&#34;。&#34; survey_id&#34; =? [[&#34; survey_id&#34;,2]] =&GT; #
我无法看到我的代码与示例之间存在任何差异。我甚至试图在SurveysController
中做出一些改动而没有任何成功:
在方法survey_params的许可中插入question_attributes:[:id,:content] 要么 如果在create方法的survey.save之后插入@ survey.questions.create(survey_params [:questions_attributes]),则会创建问题,但内容为:nill
此时我被困住了。我不知道该怎么做,我在控制器中缺少什么? 谁能给我一些帮助,谢谢。
答案 0 :(得分:12)
在控制器中的survey_params
方法中,您缺少问题参数,它应该如下所示:
def survey_params
params.require(:survey).permit(:name, :questions_attributes => [:question, :answer ... or whatever attribute for the question model])
end
让我知道它是怎么回事!
答案 1 :(得分:2)
需要更改survey_params以允许嵌套属性,来自:
def survey_params
params.require(:survey).permit(:name)
end
为:
def survey_params
params.require(:survey).permit(:name, questions_attributes: [:id , :content])
end