создание объекта с ассоциацией has_many приводит к NoMethodError - PullRequest
3 голосов
/ 23 ноября 2011

Контроллеры

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>

Я чувствую, что у меня все в значительной степени на месте, но где-то пропущено "а".Есть идеи, почему я получаю эту ошибку?

Ответы [ 2 ]

8 голосов
/ 23 ноября 2011

Обычно вы используете build_experience при использовании has_one или belongs_to ассоциации.Это работает для webconnection, потому что это has_one ассоциация.

Хотя есть разница с has_many ассоциациями: вы должны вызвать build метод для ассоциации, например: resume.experiences.build.Это указывает на

Поскольку это ассоциация has_many, а не has_one или belongs_to, вам следует использовать resume.experiences.build.

1 голос
/ 23 ноября 2011

Впредь, если вы получили такую ​​ошибку, есть самый простой способ проверить такие методы: например @ resume.methods вы получите список методов.

...