如何在模型观察器中获取current_user?

时间:2011-08-24 19:19:54

标签: ruby-on-rails ruby-on-rails-3 activerecord observer-pattern

鉴于以下模型:

Room (id, title)
RoomMembers (id, room_id)
RoomFeed, also an observer

更新房间标题后,我想创建一个RoomFeed项目,显示用户是谁进行了更新。

@room.update_attributes(:title => "This is my new title")

问题出在我的RoomFeed观察员身上:

def after_update(record)
   # record is the Room object
end

我无法获得刚刚进行更新的人的user.id.我该怎么做呢?有没有更好的方法来进行更新,所以我得到了current_user?

5 个答案:

答案 0 :(得分:5)

我认为你要找的是,你的观察者里面是room.updated_by。如果您不想持久化updated_by,只需将其声明为attr_accessor即可。在推送更新之前,请确保将current_user分配给updated_by,可能来自您的控制器。

答案 1 :(得分:3)

这是典型的“关注分离”问题。

current_user存在于控制器中,而Room模型应该对它一无所知。也许RoomManager模型可以照顾谁在改变门上的名字......

同时快速&脏解决方案是在Room.rb中抛出(非持久)属性来处理current_user ....

# room.rb
class Room
  attr_accessor :room_tagger_id
end

并在更新@room时在params中传递current_user。

那样你就有罪魁祸首! :

def after_update(record)
   # record is the Room object
   current_user = record.room_tagger_id
end

答案 2 :(得分:2)

创建以下

class ApplicationController
  before_filter :set_current_user

  private
  def set_current_user
    User.current_user = #however you get the current user in your controllers
  end
end

class User
   ...
   def self.current_user
     @@current_user
   end
   def self.current_user= c
     @@current_user = c
   end
   ...
end

然后使用......

User.current_user wherever you need to know who is logged in.  

请记住,当您从非网络请求调用类时,无法保证设置该值,例如rake任务,因此您应该检查.nil?

答案 3 :(得分:1)

答案 4 :(得分:-3)

更新user.rb

class User < ActiveRecord::Base
  cattr_accessor :current
end

更新application_controller.rb

class ApplicationController
  before_filter :set_current_user

  private
  def set_current_user
    User.current = current_user
  end
end

然后您可以在任何地方User.current获取登录用户。我正在使用这种方法在观察者中完全访问用户。