Недопустимые параметры и невозможно отобразить вложенные поля - PullRequest
0 голосов
/ 03 мая 2018

Я создаю простое приложение 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_atata в базе данных, но атрибуты Вопроса работают отлично. Я, наверное, ошибаюсь где-то в контроллере, не уверен.

1 Ответ

0 голосов
/ 03 мая 2018

Вам нужно изменить способ построения полей ответов, чтобы они назывались 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)

...