在一个表单中保存多个列

时间:2015-10-13 08:00:31

标签: ruby-on-rails

我希望用户能够在答案模型中回答分配给他们的所有问题。现在我正在尝试创建一个表单,允许我遍历用户分配给他们的问题,并在答案模型中回答它们。

在答案模型中,我保存了回复和问题ID。然而,这需要在一种形式中进行多次保存,这是我无法做到的。

模型关联看起来像这样:

用户

has_many :answers
has_many :questions, through: :question_participants

答案

belongs_to :user
belongs_to :question

现在我正在尝试创建一个像这样的Answer#new form:

  <%= form_for @answer do |f| %>
    <% @questions.each do |question| %>
        <h3><%= question.name %></h3>
        <%= f.hidden_field :question_id, value: question.id %>

          <%= f.text_field :reply, class: 'form-control' %>

    <% end %>

    <%= f.submit 'Send inn', class: 'btn btn-success' %>
  <% end %>

因此希望它允许我将多个列保存在一个中,但这不起作用。无论如何,它只保存最后一列。

我的回答控制器:

class AnswersController < ApplicationController

  def new
    @questions = current_user.questions
    @answer = current_user.answers.new
  end

  def create
    @questions = current_user.questions
    @answer = current_user.answers.new(answer_params)
    if @answer.save
      redirect_to answers_path
    else
      render 'new'
    end
  end

  private

  def answer_params
    params.require(:answer).permit(:reply, :question_id)
  end
end

1 个答案:

答案 0 :(得分:0)

您正在寻找的是accepts_nested_attributes_for

这应该有效:

#config/routes.rb
resources :answers, only: [:edit, :update]

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController 
   def edit
      @questions = current_user.questions
   end

   def update
      @answers = current_user.answers.update answer_params
   end

   private

   def answer_params 
      params.require(:answer).permit(:response) #-> question_id and user_id set on create, don't need to be changed
   end
end

这将使您能够执行以下操作:

#app/views/answers/edit.html.erb
<%= form_tag answers_update_path, method: :patch do |f| %>
   <% @questions.each do |question| %>
      <%= f.fields_for "answers[]", question do |qf| %>
         <%= qf.label question.title %>
         <%= qf.text_field :response %>
      <% end %> 
   <% end %>
   <%= f.submit %>
<% end %>

这将允许您使用以下表格:

accepts_nested_attributes_for

-

通常,您将current_user.questions与嵌套模型一起使用。但是,由于您只需要多个答案回复,因此可以使用上述内容。

这个中的错误很可能是在强大的参数中,或者在形式声明中(IE <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/navigation_drawer" android:name="com.lia.sonorMap.NavigationDrawerFragment" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" tools:layout="@layout/fragment_navigation_drawer" /> <Button android:id="@id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:layout_alignParentBottom="true"/> </android.support.v4.widget.DrawerLayout> )。如果你回复信息,我会写一些upates

参考:Multiple objects in a Rails form