“未定义的方法`元数据'为......”rails

时间:2012-07-22 10:27:08

标签: ruby-on-rails methods undefined mass-assignment

嗨我运行spec文件时遇到此问题。 这是修理模型:

class Reparator < User
  include Mongoid::Document
  include Mongoid::Timestamps
  field :private_reparator, :type => Boolean, :default => true
  field :brand_name, :type => String
  field :year_of_experience, :type => Integer, :default => 1

  has_many :reparations
  has_many :skills

  validates_presence_of :skills, :year_of_experience
  validates :year_of_experience, :numericality => {:greater_than_or_equal_to => 0}
end

这是技能模型:

class Skill
  include Mongoid::Document

  field :name, :type => String

  belongs_to :reparator

  validates_presence_of :name
  validates_uniqueness_of :name

end

这是控制器:

class ReparatorsController < ApplicationController
  respond_to :json

  def index
    @reparators = Reparator.all
    respond_with @reparators
  end

  def show
    @reparator = Reparator.find(params[:id])
    respond_with @reparator
  end

  def create
    @reparator = Reparator.new(params[:reparator])
    @reparator.skills = params[:skills]
    if @reparator.save
      respond_with @reparator
    else
      respond_with @reparator.errors
    end
  end

  def update
    @reparator = Reparator.find(params[:id])

    if @reparator.update_attributes(params[:reparator])
      respond_with @reparator
    else
      respond_with @reparator.errors
    end
  end

  def destroy
    @reparator = Reparator.find(params[:id])
    @reparator.destroy
    respond_with "Correctly destroyed"
  end

end

这是这个控制器的spec文件(我只是把测试没有通过):

it "Should create an reparator" do
      valid_skills = [FactoryGirl.create(:skill).id, FactoryGirl.create(:skill).id]
      valid_attributes = {:name => "Vianello",
                          :email => "maremma@gmail.com",
                          :address => "viale ciccio",
                          :private_reparator => true
                          }
      post :create, :reparator => valid_attributes, :skills => valid_skills
      assigns(:reparator).should be_a Reparator
      assigns(:reparator).should be_persisted
    end

这就是工厂女孩的技能:

FactoryGirl.define do
  factory :skill do
    sequence(:name) {|n| "skill#{n}"}
  end
end

2 个答案:

答案 0 :(得分:0)

我认为您的规范中存在拼写错误。 post :create, :reparator => valid_attributes, :skills => skills_ttributes应该是post :create, :reparator => valid_attributes, :skills => skills_attributes

答案 1 :(得分:0)

坏线就是这个

@reparator.skills = params[:skills]

params[:skills]是一个字符串数组(已传递的ID),但skills=方法需要给出Skill的实际实例,因此会爆炸。

除了skills=之外,mongoid还为您提供了一个skill_ids=方法,该方法允许您通过分配一组ID来更改关联的对象。或者,将自己的技能对象加载到@reparator.skills = skills