繁体   English   中英

在 Model 中访问 Devise 的 current_user

[英]Access Devise's current_user in Model

如何访问模型内​​的 Devises 'current_user' 对象? 我想在他们创建某些东西时自动将当前用户 ID 附加到记录中。 我知道我可以在控制器内部手动设置 user_id,但我觉得如果它由模型处理会更容易/更干净。

本质上,这种逻辑不属于模型,因此您最好通过模型中的函数或创建时传递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

总之,一种方法如下。

  1. 在控制器中使用before_action保存current_user
  2. current_user存储在模型中稍后可以访问的某个位置,在paper_trail的情况下是PaperTrail.request.whudunnit
  3. 访问模型内​​的商店

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM