2015-10-13 79 views
1

我希望用戶能夠在答案模型中回答分配給它們的所有問題。現在我正在嘗試創建一個表單,讓我可以循環查看用戶分配給他們的問題,並在答案模型中回答他們。以一種形式保存多列

在答案模型中,我保存答覆和問題ID。然而,這需要多種保存形式,我無法做到。

型號協會是這樣的:

用戶

has_many :answers 
has_many :questions, through: :question_participants 

回答

belongs_to :user 
belongs_to :question 

現在我想要創建一個答案#新的形式是這樣的:

<%= 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 %> 

因此ho ping它將允許我將多個列保存在一個列中,但這不起作用。無論如何,它只保存最後一列。

我的答案控制器:

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 
+0

你能解釋一下你所說的「它不僅節省了最後一列」是什麼意思?即更詳細地說明你想要發生什麼以及發生了什麼? (在編輯你的問題,而不是評論,謝謝) –

+0

@MaxWilliams試圖寫得更好! –

回答

0

什麼你要找的是accepts_nested_attributes_for

這應該工作:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :answers 
    has_many :questions, through: :answers 
    accepts_nested_attributes_for :answers 

    #this will have to be populated on user create 
    before_create :build_answers 

    private 

    def build_answers 
     questions = Question.find [1,3,4,6] 
     questions.each do |question| 
      user.build_answer(question: question) 
     end 
    end 
end 

#app/models/answer.rb 
class Answer < ActiveRecord::Base 
    #columns id | user_id | question_id | response | created_at | updated_at 
    belongs_to :user 
    belongs_to :question 
end 

#app/models/question.rb 
class Question < ActiveRecord::Base 
    has_many :answers 
    has_many :users, through: :answers 
end 

這會給你做的能力如下:

#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與嵌套模式。但是,由於您只需要多個答案回覆,您可以使用上述內容。

這個錯誤很可能出現在強參數或表單聲明中(IE current_user.questions)。如果你有信息回覆,我會寫一些upates


編號:Multiple objects in a Rails form

+0

嘿,Rich,我試着按照你的建議,但是如果沒有:id,你怎樣才能訪問答案編輯?你也想在創建用戶時運行構建答案,但是如果在稍後階段添加問題會發生什麼情況。我的系統工作方式是註冊用戶,並且是公司的一部分,那麼您將有一個管理員向您提出問題並向您分配問題。 –