自分のコードをスタンドアロンで動作させることができました(下記参照)。私はそれがあなたが期待していたように働くために3つの小さな変更を加えなければなりませんでした。
オブザーバを動作させるには、インスタンス化する必要があります。私の例では、私は、行を追加する必要:Railsでは
Mongoid.observers = CommentBadgeObserver
Mongoid.instantiate_observers
あなたは(docsによる)のconfig/application.rbにこれを追加することと同じことを達成することができます
config.mongoid.observers = :comment_badge_observer
私はそこだと思いますCommentBadge.check_conditions_for
の小さな論理エラーでもあり、> 1
は> 0
である必要があります。
最後に、関係を保存する「外部キー」フィールドがバッジ側にあるため、User#award
メソッドをユーザーではなくバッジを保存するように変更しました。
class Comment
include Mongoid::Document
field :name
belongs_to :user
end
class CommentBadgeObserver < Mongoid::Observer
observe :comment
def after_create(comment)
CommentBadge.check_conditions_for(comment.user)
end
end
class Badge
include Mongoid::Document
field :title
belongs_to :user
end
class CommentBadge < Badge
def self.check_conditions_for(user)
if user.comments.size > 0
badge = CommentBadge.create!(:title => "Comment badge")
user.award(badge)
end
end
end
class User
include Mongoid::Document
field :first_name
has_many :comments
has_many :badges
def award(badge)
self.badges << badge
badge.save!
end
end
Factory.define(:user) do |u|
u.first_name 'Bob'
end
Factory.define(:comment) do |c|
c.name 'Some comment...'
end
# Observers need to be instantiated
Mongoid.observers = CommentBadgeObserver
Mongoid.instantiate_observers
describe CommentBadgeObserver do
it 'should create badges' do
@user = Factory.build(:user)
@comment = Factory(:comment, :user => @user)
@user.badges.count.should == 1
@user.badges[0].title.should == "Comment badge"
end
end
素晴らしいです!ありがとうスティーブ! – obo
これは知っておいてありがとう、ありがとう。あなたはそれをあなたのRailsで作業させて、それをオブザーバのインスタンス化または何か他のものでしたか? – Steve
はい、私はアプリケーションで作業しました。オブザーバーのインスタンス化の2つの行をspecファイルに設定する必要がありました。 – obo