gpt4 book ai didi

ruby-on-rails - 如何在 Rails 的 ActiveRecord 回调中获取 Devise 的 current_user?

转载 作者:行者123 更新时间:2023-12-04 13:32:25 24 4
gpt4 key购买 nike

我正在使用设计和 Rails 3.2.16。我想自动插入谁创建了记录和谁更新了记录。所以我在模型中有这样的东西:

before_create :insert_created_by
before_update :insert_updated_by

private
def insert_created_by
self.created_by_id = current_user.id
end
def insert_updated_by
self.updated_by_id = current_user.id
end

问题是我收到错误 undefined local variable or method 'current_user'因为 current_user在回调中不可见。如何自动插入谁创建和更新了这条记录?

如果在 Rails 4.x 中有一种简单的方法,我将进行迁移。

最佳答案

编辑@HarsHarl 的答案可能更有意义,因为这个答案非常相似。

Thread.current[:current_user]方法,您必须进行此调用以设置 User对于每个请求。您说过您不喜欢为每个很少使用的请求设置一个变量的想法;您可以选择使用 skip_before_filter 跳过设置用户或不放置 before_filterApplicationController在需要current_user的 Controller 中设置它.

模块化方法是移动 created_by_id 的设置。和 updated_by_id关注并将其包含在您需要使用的模型中。

可审计模块:

# app/models/concerns/auditable.rb

module Auditable
extend ActiveSupport::Concern

included do
# Assigns created_by_id and updated_by_id upon included Class initialization
after_initialize :add_created_by_and_updated_by

# Updates updated_by_id for the current instance
after_save :update_updated_by
end

private

def add_created_by_and_updated_by
self.created_by_id ||= User.current.id if User.current
self.updated_by_id ||= User.current.id if User.current
end

# Updates current instance's updated_by_id if current_user is not nil and is not destroyed.
def update_updated_by
self.updated_by_id = User.current.id if User.current and not destroyed?
end
end

用户型号:
#app/models/user.rb
class User < ActiveRecord::Base
...

def self.current=(user)
Thread.current[:current_user] = user
end

def self.current
Thread.current[:current_user]
end
...
end

应用 Controller :
#app/controllers/application_controller

class ApplicationController < ActionController::Base
...
before_filter :authenticate_user!, :set_current_user

private

def set_current_user
User.current = current_user
end
end

示例用法:包括 auditable模型之一中的模块:
# app/models/foo.rb
class Foo < ActiveRecord::Base
include Auditable
...
end

其中 Auditable关注 Foo模型将分配 created_by_idupdated_by_idFoo的实例,因此您可以在初始化后立即使用这些属性,并将它们持久保存到 foos after_save 上的表打回来。

关于ruby-on-rails - 如何在 Rails 的 ActiveRecord 回调中获取 Devise 的 current_user?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20881172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com