【问题标题】:creating an object with has_many association results in NoMethodError创建具有 has_many 关联的对象会导致 NoMethodError
【发布时间】:2011-11-23 07:30:38
【问题描述】:

控制器

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”或某处。知道为什么会出现此错误吗?

【问题讨论】:

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


    【解决方案1】:

    在使用has_onebelongs_to 关联时,您通常会使用build_experience。它适用于webconnection,因为它是has_one 关联。

    但是 has_many 关联有一个区别:您必须在关联上调用 build 方法,如下所示:resume.experiences.build。这表明

    因为这是一个has_many 关联而不是has_onebelongs_to,所以您应该使用resume.experiences.build

    【讨论】:

      【解决方案2】:

      以后如果你遇到这样的错误,有最简单的方法来检查这样的方法—— 例如@resume.methods 你会得到方法列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多