同様の問題に関するほとんどの回答を読みましたが、まだ解決策が見つかりません。コードは次のとおりです。
設定
class Person < ActiveRecord::Base
# Other inconsequential code
# ...
has_and_belongs_to_many :roles
before_validation: attach_roles
# ...
def attach_roles
roles << Role.default if roles.blank?
end
end
class Role < ActiveRecord::Base
has_and_belongs_to_many: people
def self.default
#
# Get default role
#
end
end
テスト
require 'spec_helper'
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
end
describe Person do
context "constructor" do
it "creates a valid Person" do
person = build(:person)
person.should_receive(:attach_roles) # This works
person.valid?
puts person.roles.inspect # Returns []
end
it "creates a another valid Person" do
person = build(:person)
person.valid?
person.should be_valid # This fails
puts person.roles.inspect # Returns []
end
end
end
問題
コールバックが呼び出されattach_roles
ていないようです。ただしshould_receive
、真を主張します
コンソールで
p = FactoryGirl.build(:person)
p.roles # []
p.valid? # true
p.roles # [<Role>]
誰かがこれを説明できますか?
補足: デフォルトの役割を作成するためのその他のアイデアも歓迎します。
環境:
- レール3.2.1
- ルビー1.9.3
- rspec 2.12.0
- factory_girl 4.1.0