Observer的未定义局部变量或方法`current_user'?

时间:2012-08-08 21:28:05

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 devise

我已经看过几个关于将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保留在控制器中?如果是这样,我该怎么做?

感谢新手学习。

1 个答案:

答案 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链接。