关于在Rails 3.2应用程序中访问模型中的current_user的2个问题

时间:2014-12-27 00:56:42

标签: ruby-on-rails activerecord unicorn

我有一个Rails 3.2应用程序。这是一个发布应用程序,我们根据内容的变化启动了几个sidekiq作业。我是从控制器调用它,但现在有多个入口点,现在复制多个控制器中的逻辑。适当的地方是模型中的回调。但是,访问current_user是在模型中面对的,但是对于记录更改或应用程序事件的想法,它是至关重要的。

所以我有两个问题(1)当你想要在复杂的模型结构中记录变化时,是否还有一些关于访问current_user的论点? (2)这里提出的解决方案是否在2年前的最新更新中是有效的,在线程安全性方面。我在heroku上使用了三个Unicorn进程。 https://stackoverflow.com/a/2513456/152825

THX

编辑1

思考这个,想知道我是否应该在我的application.rb

中做这样的事情
class ArcCurrentUser
  @current_user_id
  def self.id
    return @current_user_id
  end

  def self.id=id_val
    @current_user_id=id_val
  end
end

然后在application_controller中的current_user方法中,只需将ArcCurrentUser.id更新为@ current_user.id?我只会将它用于此日志记录功能...

1 个答案:

答案 0 :(得分:0)

您的更正是因为您无法从模型中访问current_user

至于你联系的答案,我并不完全确定,但我认为它不是完全线程安全的。从同一个问题来看,我更喜欢这个答案https://stackoverflow.com/a/12713768/4035338

假设我们有一个带有此操作的控制器

...
def update
  @my_object = MyModel.find(params[:id])
  @my_object.current_user = current_user
  @my_object.assign_attributes params[:my_model]
  @my_object.save
end
...

和这个模型

class MyModel < ActiveRecord::Base
  attr_accessor :current_user

  before_save :log_who_did_it

  private

  def log_who_did_it
    return unless current_user.present?
    puts "It was #{current_user}!"
  end
end

或者我最喜欢的

...
def update
  @my_object = MyModel.find(params[:id])
  @my_object.update_and_log_user(params[:my_model], current_user)
end
...

class MyModel < ActiveRecord::Base
  ...

  def update_and_log_user(params, user)
    update_attributes(params)
    puts "It was #{user}!" if user.present?
  end
end