ruby on rails - Undefined method when rendering form partial -
on questions index page have list of questions. want able answer each question right on page rendering answers form. getting error when try , that:
undefined method `answers' #<question:0x00000103dc0100>
it highlights second line of answers controller:
def create @question = question.find(params[:question_id]) @answer = @question.answers.new(answer_params) @answer.save end
here view:
<% @questions.each |question| %> <%= question.body %> <%= render :partial => "answers/form", locals: {question:question} %> <% end %>
and form looks this:
<%= simple_form_for [question, answer.new] |f| %> <%= f.input :body %> <% end %>
lastly, questions controller:
def index @questions = @comment.questions.order @answer = answer.new end
since have belongs_to
has_one
relationship, correct association this:
question.find(params[:question_id]).answer
note answer
singular. because each question
has one answer
- thus, instances of question
not have method answers
, indicated in exception.
if wanted each question have multiple answers, you'd define following associations:
# app/models/question.rb class question < activerecord::base has_many :answers end # app/models/answer.rb class answer < activerecord::base belongs_to :question end
with belongs_to
has_many
relationship, you'd able access multiple answers on each question follows:
question.find(params[:question_id]).answers
update 1:
there couple ways add answer
question
.
option 1: utilizing rails build
method made available has_one
association:
question.find(params[:question_id]).build_answer(answer_params)
option 2: directly assign answer
question
:
answer = answer.first question = question.first question.answer = answer
in either method, note that, because each question
limited a single answer
, question's existing answer replaced, rather added to.
update 2:
here's how controller action should in entirety utilizing each of suggested methods:
option 1:
# app/controllers/answers_controller.rb def create @question = question.find(params[:question_id]) @question.build_answer(answer_params) end
option 2:
# app/controllers/answers_controller.rb def create @answer = answer.new(answer_params) @question = question.find(params[:question_id]) @question.answer = @answer end
Comments
Post a Comment