Как получить current_user в наблюдателе модели? - PullRequest
5 голосов
/ 24 августа 2011

Учитывая следующие модели:

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 ]

5 голосов
/ 24 августа 2011

Я думаю, что вы ищете, room.updated_by внутри вашего наблюдателя.Если вы не хотите сохранять updated_by, просто объявите его как attr_accessor.Перед загрузкой обновления убедитесь, что вы назначили current_user для updated_by, возможно, от вашего контроллера.

3 голосов
/ 24 августа 2011

Это типичная проблема разделения интересов.

current_user живет в контроллере, и модель Room ничего не должна знать об этом. Может быть, модель RoomManager позаботится о том, кто меняет имя на дверях ...

Между тем, быстрое и грязное решение - бросить (непостоянный) атрибут в Room.rb для обработки current_user ....

# room.rb
class Room
  attr_accessor :room_tagger_id
end

и передайте свой current_user в параметрах при обновлении @room.

Таким образом, у тебя есть преступник! :

def after_update(record)
   # record is the Room object
   current_user = record.room_tagger_id
end
2 голосов
/ 25 августа 2011

Создайте следующее

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.  

Помните, что значение не гарантируется, когда ваш класс вызывается из не-веб-запросов, как и рейк-задачи, поэтому вы должны проверить на .nil?

1 голос
/ 07 апреля 2012

Я полагаю, это лучший подход

http://rails -bestpractices.com / posts / 47-fetch-current-user-in-models

0 голосов
/ 07 августа 2012

Обновление 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 в любом месте.Я использую этот подход для доступа к пользователю точно в наблюдателях.

...