将数据添加到Rails中用外键引用的表中

时间:2019-05-02 11:39:30

标签: ruby-on-rails

我有两个模型:QuestionOptions。问题与选项具有has_many关系。每当我创建新问题时,我都需要添加问题选项。我已经编写了代码,但是无法将数据发送到Question模型的选项。每当我创建问题并在表单中添加选项时,该问题的选项均为空。错误在哪里?

模型

class Question < ApplicationRecord
  belongs_to :user
  has_many :options

  accepts_nested_attributes_for :options
end

class Option < ApplicationRecord
  belongs_to :question
end

questions_controller.rb

# GET /questions/new
  def new
    @question = Question.new
    @question.options.build(params[:options])
  end

  # GET /questions/1/edit
  def edit
  end

  # POST /questions
  # POST /questions.json
  def create
    @question = Question.new(question_params)
    puts("---------------------Question options: --------------------------------------------")
    puts(@question.options)    
    @question.user = current_user

    respond_to do |format|
      if @question.save
        format.html { redirect_to @question, notice: 'Question was successfully created.' }
        format.json { render :show, status: :created, location: @question }
      else
        format.html { render :new }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /questions/1
  # PATCH/PUT /questions/1.json
  def update
    respond_to do |format|
      if @question.update(question_params)
        format.html { redirect_to @question, notice: 'Question was successfully updated.' }
        format.json { render :show, status: :ok, location: @question }
      else
        format.html { render :edit }
        format.json { render json: @question.errors, status: :unprocessable_entity }
      end
    end

_form.html.erb

<%= form_with(model: question, local: true) do |form| %>
  <% if question.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(question.errors.count, "error") %> prohibited this question from being saved:</h2>

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

  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body %>
  </div>

  <%= form.fields_for :address do |a| %>
    <div class="field">
      <%= a.label :option1 %>
      <%= a.text_area :body %>
    </div>

    <div class="field">
      <%= a.label :option2 %>
      <%= a.text_area :body %>
    </div>
  <% end %>


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

1 个答案:

答案 0 :(得分:1)

在这种情况下,我强烈建议使用FormObject代替accepts_nested_attributes_for。以下是有关如何实现FormObject的快速视频。 https://thoughtbot.com/upcase/videos/form_objects

此外,有关accepts_nested_attributes_for为何不是一个很好的选择的问题,here也有相关讨论。