【问题标题】:Access Devise's current_user in Model在 Model 中访问 Devise 的 current_user
【发布时间】:2011-04-04 22:38:36
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 devise


    【解决方案1】:

    本质上,这种逻辑不属于模型,因此您最好通过模型中的函数或创建时传递current_userThis answer 总结了一下。

    我知道,我知道,这不是你想要的答案。不幸的是,它看起来可能更干净,但它会增加您真正不想要的模型开销。

    【讨论】:

    • 这是一个向上箭头来否定向下箭头的愚蠢误用!干杯
    • @Kelly 我想编辑您的答案以包含 “将current_user 传递给模型” 明确作为替代方案,但无法真正弄清楚怎么不觉得我会过多地改变你的答案。
    【解决方案2】:

    很多热门gem需要访问模型中的current_userpaper_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. 访问模型内​​的商店

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2013-09-04
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多