我已经看过几个关于将current_user
用于观察者的问题,并试图实现一个人所说但不起作用的问题(see here)。
当复选框标记为true时,我正在尝试由我的观察者创建一名工程师。工程师和军队属于用户:
模型/ user.rb
class User < ActiveRecord::Base
cattr_accessor :current
has_many :armies
has_many :engineers
end
控制器/ application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :set_time_zone, :set_current_user
private
def set_current_user
User.current = current_user
end
end
的模型/ army_observer.rb
class ArmyObserver < ActiveRecord::Observer
def after_save(army)
if army.siege
Engineer.create({ :user_id => current_user.id, :army_id => :army_id })
end
end
end
使用此代码,它会给我错误:
undefined local variable or method `current_user' for #<ArmyObserver:0x4e68970>
还有其他方式吗?也许它与Devise current_user方法冲突?也许最好将current_user
保留在控制器中?如果是这样,我该怎么做?
感谢新手学习。
答案 0 :(得分:2)
您正在将Devise的current_user
分配给User.current
类访问器,因为它在模型(和观察者)级别上不可用。因此,不要尝试在那里使用current_user
,而是使用刚刚创建的类访问器:
Engineer.create({ :user_id => User.current.id, :army_id => :army_id })
编辑:
顺便说一句,我不认为这是线程安全的 - 除非你在你引用的帖子的一个答案中实现the first part of this solution链接。