2016-05-16 53 views
0

我有一個問題&答案模型 - 類似於SO。如何解決這個嵌套的構建對象關聯?

我想要做的是在我的問題#顯示頁面上,我希望用戶能夠添加他們的答案並將其與該問題和用戶記錄相關聯。

這是我有:

Questions#Show view

 <div class="ibox-content"> 
      <%= render partial: "answers/form", locals: {answer: @question.answers.build(user: current_user)} %> 
     </div> 

在我Answers#_Form

<%= simple_form_for(answer) do |f| %> 
    <div class="form-inputs"> 
    <%= f.input :body %> 
    </div> 

    <div id="new-post-submission-button"> 
    <%= f.button :submit, class: "btn btn-lg btn-primary pull-right" %> 
    </div> 
<% end %> 

這是我question#show控制器:

def show 
end 

這是我answer#create控制器:

def create 
    @answer = Answer.new(answer_params) 

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

這是answer_params

private 
    # Never trust parameters from the scary internet, only allow the white list through. 
    def answer_params 
     params.require(:answer).permit(:body, :user_id, :question_id) 
    end 

然而,一旦我在問答形式提交的東西,它創造了一個全新的記錄(不就是render partial調用內置的一個。

這裏是最初的紀錄 - 這是我從pry了上呈現_form.html.erb部分實際:

[1] pry(#<#<Class:0x007fe931ec9768>>)> answer 
=> #<Answer:0x007fe9385ec3a0 id: nil, body: nil, user_id: 1538, question_id: 4, created_at: nil, updated_at: nil> 

然而,這就是被提交,並創造了分貝:

[117] pry(main)> Answer.last 
    Answer Load (2.5ms) SELECT "answers".* FROM "answers" ORDER BY "answers"."id" DESC LIMIT $1 [["LIMIT", 1]] 
=> #<Answer:0x007f87073772c0 
id: 48, 
body: "Does this one with user_id: 1538 and question_id: 4 get submitted?", 
user_id: nil, 
question_id: nil, 
created_at: Mon, 16 May 2016 07:49:58 UTC +00:00, 
updated_at: Mon, 16 May 2016 07:49:58 UTC +00:00> 

注意user_idquestion_id在兩者中都不相同(因爲一旦提交完成,它會創建一個全新的記錄,而不是使用通過locals傳遞給它的記錄)。

什麼是最好的方式來處理我想要做的最Railsy方式?

編輯1

下面是在Answer#Create動作檢查的PARAMS:

[1] pry(#<AnswersController>)> answer_params 
=> <ActionController::Parameters {"body"=>"Does this one with user_id: 1538 and question_id: 4 get submitted?"} permitted: true> 
[2] pry(#<AnswersController>)> params 
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"NYMYT9K2AhLQ7seiYLr01ir/udTDbjmaBEsnEXLTSl/kcZg08f6L+mJW9G/kHMQaODmQhxisfn6Xm3OGMdGcfQ==", "answer"=><ActionController::Parameters {"body"=>"Does this one with user_id: 1538 and question_id: 4 get submitted?"} permitted: false>, "commit"=>"Create Answer", "controller"=>"answers", "action"=>"create"} permitted: false> 
[3] pry(#<AnswersController>)> @answer 
=> nil 
[4] pry(#<AnswersController>)> params[:answer] 
=> <ActionController::Parameters {"body"=>"Does this one with user_id: 1538 and question_id: 4 get submitted?"} permitted: false> 
[5] pry(#<AnswersController>)> answer_params 
=> <ActionController::Parameters {"body"=>"Does this one with user_id: 1538 and question_id: 4 get submitted?"} permitted: true> 

編輯2

Question#New

def new 
    @question = Question.new 
    end 

Answer#New

def new 
    @answer = Answer.new 
    end 
+0

你可以檢查'create'行爲中的'params'併發布輸出嗎? – Pavan

+0

@Pravan完成。刷新問題。 – marcamillion

+0

嘗試添加'@question = Question.find「id」'到你的問題#show action –

回答

0

我終於想通了。

在我的形式,我添加了這些隱藏字段:

<%= f.input :question_id, as: :hidden %> 
    <%= f.input :user_id, as: :hidden %> 

然後在我的Answers#Create行動,我只是這樣做:

question = Question.find(answer_params[:question_id]) 
user = User.find(answer_params[:user_id]) 
@answer = question.answers.create(user: user, question: question, body: answer_params[:body]) 

因爲我終於想通了,一旦我通過他們在通過隱藏的字段,他們被允許像這樣:

[5] pry(#<AnswersController>)> answer_params 
=> <ActionController::Parameters {"body"=>"This is a test submission.", "user_id"=>"1535", "question_id"=>"4"} permitted: true> 

現在所有的作品像一個魅力!