我有一个Rails 3.2应用程序。这是一个发布应用程序,我们根据内容的变化启动了几个sidekiq作业。我是从控制器调用它,但现在有多个入口点,现在复制多个控制器中的逻辑。适当的地方是模型中的回调。但是,访问current_user是在模型中面对的,但是对于记录更改或应用程序事件的想法,它是至关重要的。
所以我有两个问题(1)当你想要在复杂的模型结构中记录变化时,是否还有一些关于访问current_user的论点? (2)这里提出的解决方案是否在2年前的最新更新中是有效的,在线程安全性方面。我在heroku上使用了三个Unicorn进程。 https://stackoverflow.com/a/2513456/152825
THX
思考这个,想知道我是否应该在我的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?我只会将它用于此日志记录功能...
答案 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