【发布时间】:2011-04-04 22:38:36
【问题描述】:
如何访问模型内的 Devises 'current_user' 对象?我想在他们创建某些东西时自动将当前用户 ID 附加到记录中。我知道我可以在控制器内部手动设置 user_id,但我觉得如果它由模型处理会更容易/更干净。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 devise
如何访问模型内的 Devises 'current_user' 对象?我想在他们创建某些东西时自动将当前用户 ID 附加到记录中。我知道我可以在控制器内部手动设置 user_id,但我觉得如果它由模型处理会更容易/更干净。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 devise
本质上,这种逻辑不属于模型,因此您最好通过模型中的函数或创建时传递current_user。 This answer 总结了一下。
我知道,我知道,这不是你想要的答案。不幸的是,它看起来可能更干净,但它会增加您真正不想要的模型开销。
【讨论】:
current_user 传递给模型” 明确作为替代方案,但无法真正弄清楚怎么不觉得我会过多地改变你的答案。
很多热门gem需要访问模型中的current_user如paper_trail。
他们的方法从捕获current_user 的控制器开始。
class ApplicationController
before_action :set_paper_trail_whodunnit
end
哪些触发器:
def set_paper_trail_whodunnit
if ::PaperTrail.request.enabled?
::PaperTrail.request.whodunnit = user_for_paper_trail
end
end
和
def user_for_paper_trail
return unless defined?(current_user)
current_user.try(:id) || current_user
end
从控制器保存current_user.id后,触发创建等审计动作。
class Widget < ActiveRecord::Base
has_paper_trail
end
最终触发以下事件。
module PaperTrail
module Events
class Create < Base
def data
data = {
item: @record,
event: @record.paper_trail_event || "create",
whodunnit: PaperTrail.request.whodunnit
},
# .. more create code here
end
end
end
总而言之,一种方法如下。
before_action 保存current_user
current_user 存储在模型中稍后可以访问的位置,在paper_trail 的情况下为PaperTrail.request.whudunnit
【讨论】: