在我的问题索引页面上,我列出了所有问题。我希望能够通过呈现答案表单来回答页面上的每个问题。当我尝试这样做时,我收到了这个错误:
undefined method `answers' for #<Question:0x00000103dc0100>
它突出显示了答案控制器的第二行:
def create
@question = Question.find(params[:question_id])
@answer = @question.answers.new(answer_params)
@answer.save
end
以下是观点:
<% @questions.each do |question| %>
<%= question.body %>
<%= render :partial => "answers/form", locals: {question:question} %>
<% end %>
表格如下:
<%= simple_form_for [question, Answer.new] do |f| %>
<%= f.input :body %>
<% end %>
最后,问题控制者:
def index
@questions = @comment.questions.order
@answer = answer.new
end
答案 0 :(得分:3)
由于您之间存在belongs_to
has_one
关系,因此正确的关联是:
Question.find(params[:question_id]).answer
请注意,answer
是单数。这是因为每个Question
只有一个 Answer
- 因此,Question
的实例没有方法answers
,如异常中所示。
如果您希望每个问题都有多个答案,您可以定义以下关联:
# app/models/question.rb
class Question < ActiveRecord::Base
has_many :answers
end
# app/models/answer.rb
class Answer < ActiveRecord::Base
belongs_to :question
end
belongs_to
has_many
关系,您可以按如下方式访问每个问题的多个答案:
Question.find(params[:question_id]).answers
更新1 :
有几种方法可以将Answer
添加到Question
。
选项1 :利用build
method提供的Rails has_one
association:
Question.find(params[:question_id]).build_answer(answer_params)
选项2 :直接将Answer
分配给Question
:
answer = Answer.first
question = Question.first
question.answer = answer
在任何一种方法中,请注意,由于每个Question
仅限于一个 Answer
,因此问题的现有答案将被替换,而不是添加到。
更新2 :
以下是您的控制器操作应如何使用每种建议的方法完整查看:
选项1 :
# app/controllers/answers_controller.rb
def create
@question = Question.find(params[:question_id])
@question.build_answer(answer_params)
end
选项2 :
# app/controllers/answers_controller.rb
def create
@answer = Answer.new(answer_params)
@question = Question.find(params[:question_id])
@question.answer = @answer
end
答案 1 :(得分:2)
如果您有belongs_to问题,并且has_one:answer,那么您只能执行以下操作:
Question.find(1).answer
不
Question.find(1).answers
这将是一个has_many关系
@answer = answer.new
几乎绝对不是你想要的。
你想要
@answer = Answer.new
或者
@answer = @question.answers.new
或者
@answer = @question.answer.new
答案 2 :(得分:0)
您似乎没有在模型中设置关联。基本上,Rails正在寻找问卷模型中称为“答案”的方法。您是否在答案模型中设置了belongs_to :question
,在问题模型中设置了has_many :answers
?如果没有看到您的型号代码,无法判断这是否是真正的问题。
关于协会的更多信息:http://guides.rubyonrails.org/association_basics.html
编辑 - 因为你有一个has_one关联,所以语法有点不同。
尝试将“回答”更改为“回答” - 请参阅此文档中有关不同关联类型的生成方法的表格:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001834