我正在使用Devise和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
在回调中不可见。我如何自动插入谁创建和更新了此记录?
如果在Rails4.x中有一种简单的方法可以做到这一点,我将进行迁移。
4条答案
按热度按时间lb3vh1jj1#
编辑@HarsHarl的答案可能会更有意义,因为这个答案非常相似。
使用
Thread.current[:current_user]
方法,您必须进行此调用来为每个请求设置User
。您可以选择使用skip_before_filter
跳过设置用户,或者不将before_filter
放在ApplicationController
中,而是将其设置在需要current_user
的控制器中。模块化方法是将
created_by_id
和updated_by_id
的设置移动到关注点,并将其包含在您需要使用的模型中。auditable
模块:在
Foo
模型中包含Auditable
concern会在初始化时将created_by_id
和updated_by_id
分配给Foo
的示例,这样您就可以在初始化后立即使用这些属性,并且它们会在after_save
回调时持久保存到foos
表中。ldxq2e6h2#
另一种方法是这样的,
yacmzcpb3#
current_user不能从Rails中的模型文件中访问,只能从控制器、视图和助手中访问。虽然,通过类变量你可以实现这一点,但这不是一个好的方法,因为你可以在他的模型中创建两个方法。当从控制器创建操作调用时,将当前用户和字段名发送到该模型,例如:
而且在模型编写中
其他方法相同
xytpbqjk4#
只需在模型中创建一个属性访问器,并在记录保存到控制器中时初始化它,如下所示