FactoryGirl传递'nil'而不是值

时间:2012-04-08 17:56:10

标签: ruby-on-rails rspec tdd factory-bot

我从Rails和RSpec开始,并在FactoryGirl遇到麻烦。基本上该对象不接收属性。

模型/ user.rb

class User < ActiveRecord::Base

    attr_accessor :name, :email, :show_name, :company, :identity, :password, :phone, :mobile
    validates_presence_of :name, :show_name, :email, :company, :identity, :password, :phone
    validates_uniqueness_of :email

end

规格/ factories.rb

FactoryGirl.define do
    factory :user do
        name "John Doe"
        email "john@example.org"
        show_name "John Doe"
        company "Company"
        identity "123.456.789-10"
        password "abc123"
        phone "1234-5678"
        mobile "1234-5678"
    end
end

Rails控制台

irb(main):001:0> u = FactoryGirl.create(:user)
   (0.1ms)  BEGIN
  User Exists (0.3ms)  SELECT 1 FROM `users` WHERE `users`.`email` = BINARY 'john@example.org' LIMIT 1
  SQL (0.4ms)  INSERT INTO `users` (`company`, `email`, `identity`, `mobile`, `name`, `password`, `phone`, `show_name`) VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
Mysql2::Error: Column 'company' cannot be null: INSERT INTO `users` (`company`, `email`, `identity`, `mobile`, `name`, `password`, `phone`, `show_name`) VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
   (0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: Column 'company' cannot be null: INSERT INTO `users` (`company`, `email`, `identity`, `mobile`, `name`, `password`, `phone`, `show_name`) VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

有人知道什么是错的吗?

2 个答案:

答案 0 :(得分:2)

我想你可能意味着把attr_accessible放在attr_accessor

attr_accessible是一个rails函数,用于将字段列入白名单以进行质量分配。 attr_accessor是一个ruby函数,用于生成会干扰事物的getter和setter。

答案 1 :(得分:1)

不要将attr_accessor用于保存在数据库中的属性。 Active Record为您生成这些访问者。通过使用attr_accessor,您将覆盖那些没有存储Active Record期望找到它们的值的访问器。