【问题标题】:Unpermitted parameters & unable to display nested fields_for不允许的参数 & 无法显示嵌套的 fields_for
【发布时间】:2018-05-03 19:50:45
【问题描述】:

我正在构建简单的 ROR 应用程序,其中包含调查问题和答案。调查是使用脚手架方法生成的,而问题和答案只是模型。

Survey.rb

class Survey < ApplicationRecord
 has_many :questions
 accepts_nested_attributes_for :questions, allow_destroy: true
 validates :name, presence: true
end

Question.rb

class Question < ApplicationRecord
 belongs_to :survey
 has_many :answers
 accepts_nested_attributes_for :answers
 validates :question_content, presence: true
end

Answer.rb

class Answer < ApplicationRecord
 belongs_to :question
end

survey_controller.rb

class SurveysController < ApplicationController
before_action :set_survey, only: [:show, :edit, :update, :destroy]

def index
 @surveys = Survey.all
end

def show
 @survey= Survey.find(params[:id])
end

def new
 @survey = Survey.new
 @questions = @survey.questions.new
 @answers = @questions.answers.new
end

def edit
end

def create
 @survey = Survey.new(survey_params)
 Survey.create(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

def update
respond_to do |format|
  if @survey.update(survey_params)
    format.html { redirect_to @survey, notice: 'Survey was successfully updated.' }
    format.json { render :show, status: :ok, location: @survey }
  else
    format.html { render :edit }
    format.json { render json: @survey.errors, status: :unprocessable_entity }
  end
end
end

def destroy
@survey.destroy
respond_to do |format|
  format.html { redirect_to surveys_url, notice: 'Survey was successfully destroyed.' }
  format.json { head :no_content }
end
end

private
def set_survey
  @survey = Survey.find(params[:id])
end

def survey_params
  params.require(:survey).permit(:name, questions_attributes: [:id, :question_content], answers_attributes: [:id, :answer_content, :answer_type])
end
end

部分调查表

<%= form_for(@survey) do |form| %>
<% if survey.errors.any? %>
<div id="error_explanation">
  <h2><%= pluralize(survey.errors.count, "error") %> prohibited this survey from being saved:</h2>

  <ul>
  <% survey.errors.full_messages.each do |message| %>
    <li><%= message %></li>
  <% end %>
  </ul>
</div>
<% end %>

<div class="field">
<%= form.label :name %>
<%= form.text_field :name, id: :survey_name %>
</div>

<%= form.fields_for :questions do |builder| %>
<fieldset>
  <%= builder.label :question_content, "Question" %><br/>
  <%= builder.text_area :question_content %><br/>
  <%= form.fields_for :answers do |f| %>
    <fieldset>
        <%= f.text_area :answer_type %>
        <%= f.text_area :answer_content %><br/>
    </fieldset>
</fieldset>
<% end %>
<%end %>


<div class="actions">
<%= form.submit %>
</div>

我想在单页即调查中实施问答。任何帮助将不胜感激。

问题:无法将 answers_attributes 保存到数据库,但问题属性可以正常工作。我可能在控制器的某个地方犯了错误,不确定。

【问题讨论】:

    标签: ruby-on-rails parameters ruby-on-rails-5 fields-for


    【解决方案1】:

    您需要更改构建答案字段的方式,以便将它们引用为 fields_for questions,而不是 surveys。尝试更改这段代码:

    <%= form.fields_for :questions do |builder| %>
    <fieldset>
      <%= builder.label :question_content, "Question" %><br/>
      <%= builder.text_area :question_content %><br/>
      <%= form.fields_for :answers do |f| %>
        <fieldset>
            <%= f.text_area :answer_type %>
            <%= f.text_area :answer_content %><br/>
        </fieldset>
    </fieldset>
    <% end %>
    <%end %>
    

    到这里:

    <%= form.fields_for :questions do |builder| %>
      <fieldset>
        <%= builder.label :question_content, "Question" %><br/>
        <%= builder.text_area :question_content %><br/>
        <%= builder.fields_for :answers do |f| %>
          <fieldset>
            <%= f.text_area :answer_type %>
            <%= f.text_area :answer_content %><br/>
          </fieldset>
        <% end %>
      </fieldset>
    <% end %>
    

    (注意:有意义的变化是将form.fields_for更改为builder.fields_for

    【讨论】:

    • 你好 Derek,添加构建器引用到答案不会在前端显示任何字段
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多