渲染表单部分时的未定义方法

时间:2014-02-06 03:06:38

标签: ruby-on-rails

在我的问题索引页面上,我列出了所有问题。我希望能够通过呈现答案表单来回答页面上的每个问题。当我尝试这样做时,我收到了这个错误:

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 

3 个答案:

答案 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