使用has_many关联创建对象会导致NoMethodError

时间:2011-11-23 07:30:38

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 associations

控制器

class ExperiencesController < ApplicationController
  def create
    @resume = Resume.find(params[:resume])
    @experience = @resume.build_experience(params[:experience])
  end
end

class ResumesController < ApplicationController
  def create
    @resume = Resume.new(params[:resume])
    @resume.build_webconnection
    @resume.build_experience   # <<<<<<<<< Error occurs here

    if @resume.save
      #UserMailer.created_resume_email(@user).deliver
      redirect_to @resume
    else
      @title = "Create a new resume"
      render :action => "new"
    end
  end
end

模型

class Experience < ActiveRecord::Base
  belongs_to :resume
end

class Resume < ActiveRecord::Base
  has_one   :webconnection
  has_many  :experiences
end

尝试创建简历时出现错误消息(也创建与简历相关联的体验)

NoMethodError in ResumesController#create
undefined method `build_experience' for #<Resume:0xbb428a4>

我觉得我已经把所有东西都放在了一边,但却错过了一个's'或某个地方。知道我为什么会收到这个错误吗?

2 个答案:

答案 0 :(得分:8)

使用build_experiencehas_one关联时,通常会使用belongs_to。它适用于webconnection,因为它是has_one关联。

has_many关联存在差异:您必须在关联上调用build方法,如下所示:resume.experiences.build。这表明

由于这是has_many关联,而不是has_onebelongs_to,因此您应该使用resume.experiences.build

答案 1 :(得分:1)

从此以后如果你有这样的错误,有最简单的方法来检查这样的方法 - 例如@ resume.methods您将获得方法列表。