背景细节
我正在使用Devise进行身份验证以登录到Rails 5应用程序.
每当我捆绑Audited或Paper Trail gem时,当我尝试#create一个新会话时(通过登录表单 - /users/sign_in),我收到以下错误:
ActionController::InvalidAuthenticityToken
Run Code Online (Sandbox Code Playgroud)
环境细节
Ruby 2.3.1
宝石:
重现步骤:
我在我的应用程序中使用Audited gem来跟踪用户日志.除了当前的用户跟踪,一切正常.
在我的情况下,我有2个模型:Instructor和Student.Instructor将是current_admin_user,我需要手动找到学生.
为了解决这个问题,我尝试current_user_method在初始化程序中覆盖并创建一个audited.rb文件,其中包含以下内容:
Audited.current_user_method = :current_admin_user
Run Code Online (Sandbox Code Playgroud)
这工作正常,但当我使用任何其他方法,如current_user_or_student...
Audited.current_user_method = :current_user_or_student
Run Code Online (Sandbox Code Playgroud)
在application_controller.rb......
def current_user_or_student
current_admin_user || InstructorStudent.find_by_id(id)
end
Run Code Online (Sandbox Code Playgroud)
它不会进入这种方法,甚至current_admin_user也不会存储在审计中.
为什么current_user_or_student在覆盖它时我的方法不被调用application_controller.rb?
我audited用来跟踪一个名为的模型的变化Page.我希望能够找到与某个用户相关的所有审核(通过user_id审核表).
我怎样才能做到这一点?到目前为止,我发现访问Audit模型的唯一方法是这样的:
@audits = Audited::Adapters::ActiveRecord::Audit.all
Run Code Online (Sandbox Code Playgroud)
这似乎不是正确的做事方式.
尝试@audits = Audit.all给出Uninitialized constant错误.
是否有更优雅的方式与宝石提供的模型进行交互?
我已经审核(以前的acts_as_audited)设置和工作。user_id 已成功保存在审计表中,但我想不出一种有效的方法来保存tenant_id(我有带范围的多租户设置)。我曾尝试使用自述文件中描述的关联审计技术,但这对我不起作用。
我目前的解决方案是在每个模型中使用after_audit回调(可以使用 Rails 关注点实现)来获取最后一次审计并保存租户 ID:
def after_audit
audit = Audit.last
audit.tenant_id = self.tenant_id
audit.save!
end
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但必须再次查询审计然后更新它似乎效率低下。在保存之前将tenant_id添加到审计中对我来说更有意义,但我不知道如何做到这一点。是否可以在保存之前将tenant_id 添加到审计中?如果是,那么如何?
编辑:
我也试过在我的审计模型中包含我的默认租户范围,但它似乎没有被调用:
审计文件
class Audit < ActiveRecord::Base
default_scope { where(tenant_id: Tenant.current_id) }
Run Code Online (Sandbox Code Playgroud)
应用控制器.rb
class ApplicationController < ActionController::Base
around_action :scope_current_tenant
def scope_current_tenant
Tenant.current_id = current_tenant.id
yield
ensure
Tenant.current_id = nil
end
Run Code Online (Sandbox Code Playgroud)
编辑:2/1/16
我仍然没有对此实施解决方案,但是我目前的想法是使用:
#model_name.rb
def after_audit
audit = self.audits.last
audit.business_id = self.business_id
audit.save!
end
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我们获得了当前模型的最后一次审计。这样我们只处理当前模型,没有机会将审计添加到另一个业务中(据我所知)。我会将此代码添加到一个问题中以使其保持干燥。
我仍然无法让正常的 Rails 回调在审计模型中工作。我目前看到的唯一另一种方法是 fork 和修改 gem 源代码。
嘿,我想一起使用 Devise 和 act_as_audited 但是当我尝试使用 -
class ApplicationController < ActionController::Base
audit Candidate
protected
def current_user
@user = User.find(user_session)
end
Run Code Online (Sandbox Code Playgroud)
我收到这个错误。
stack level too deep
Run Code Online (Sandbox Code Playgroud)
我需要以不同的方式做吗?
谢谢
在为学习RoR而构建的应用中,我想添加变更跟踪并为此使用Audited gem。虽然很清楚如何将其添加到模型中,但如何查看更改?
我想在每个页面上为不同的对象/类/模型添加一个链接/按钮,以打开带有审核日志的视图。即列出所有更改(日期/时间,字段,旧值,新值,按用户),并按更改的日期/时间排序。
找不到任何文档。所有帮助入门的帮助。