我正在使用RSpec,FactoryGirl和ActiveRecord。以下测试未通过:
require 'spec_helper'
describe User, type: :model do
it "has a valid factory" do
expect(FactoryGirl.create(:user)).to be_valid
end
end
我有以下错误:
1) User has a valid factory
Failure/Error: expect(FactoryGirl.create(:user)).to be_valid
ActiveRecord::RecordInvalid:
Validation failed: Role can't be blank
我也有以下型号:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
enum role: [:admin, :student, :school]
validates :role, presence: true
end
我有以下工厂:
require 'faker'
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "person#{n}@example.com" }
password Faker::Internet.password(8, 16)
role :student
end
end
但是,如果我删除模型中的枚举,它就会通过:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :role, presence: true
end
我想保留枚举,因为我只想让一组字符串代表角色。
我希望能够帮助我正确合并FactoryGirl和enum的信息。
答案 0 :(得分:1)
在用户的工厂定义中,您可以使用role :student
设置角色。枚举存储为整数而非字符串 - 为了使您的定义有效,您需要role User.roles["student"]
之类的内容。
有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Enum.html。
答案 1 :(得分:0)
在@ eugen的回答中使用,我现在看到我应该将列创建为整数并且我已将其声明为字符串:
class AddRoleToUser < ActiveRecord::Migration
def change
add_column :users, :role, :string, null: false
end
end
我运行了以下迁移来修复我的错误,但它确实有效:
class ChangeRoleRepresentationInTable < ActiveRecord::Migration
def change
change_column :users, :role, 'integer USING CAST(role AS integer)', null: false
end
end