gpt4 book ai didi

ruby-on-rails - 在模型中访问 c​​urrent_user;必须是一种更好的日志记录和身份验证方法

转载 作者:行者123 更新时间:2023-12-05 06:47:15 24 4
gpt4 key购买 nike

我知道教条说不要在模型中访问 c​​urrent_user 但我并不完全同意。例如,我想在通过 rails 回调发生操作时编写一组日志记录函数。或者当一个对象可以有多个人写入它时,简单地写下谁写了更改(不像只有一个所有者的消息)。在很多方面,我将 current_user 更多地看作是应用程序的配置——换句话说,让这个应用程序响应这个用户。我宁愿通过模型 DSL 进行日志记录,也不愿在看起来真的不合适的操作中进行记录。我错过了什么?

这个想法似乎有点不雅Access current_user in model

就像这样:http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

谢谢

编辑#1所以我的问题不是是否有可以进行审计/日志记录的 gem 。我目前使用 paper_trail(虽然我正在远离它,因为我可以在大约 10 行 ruby​​ 代码中完成相同的功能);更多的是关于是否永远不应在模型中访问 c​​urrent_user - 我本质上想减少我的 Controller 代码并将逻辑下推到它应该在的模型中。部分原因可能是 ActiveRecord 的历史,它本质上是数据库表的包装器,多年来 RoR 为其添加了许多功能。

最佳答案

您已经给出了几个您想要完成的示例,我将分别针对每个示例介绍解决方案:

I want to write a set of logging functions when an action happens via a rails callback

取决于您想要记录的方式(数据库与写入记录器)。如果你想登录到数据库,你应该有一个单独的日志模型,它从 Controller 获得适当的信息,或者简单地使用 belongs_to :user 类型设置。如果你想写入记录器,你应该在你的应用程序 Controller 中创建一个方法,你可以从你的创建和更新方法(或者你想要回调的任何其他操作)调用它。

Or simply writing who wrote a change when an object can have multiple people write to it

class Foo < ActiveRecord::Base
belongs_to :user, as: :edited_by
end

class FooController < ApplicationController
def update
@foo = Foo.find(params[:id])
@foo.attributes = params[:foo]
@foo.edited_by = current_user
end
end

我认为您误解了 Rails 中模型的作用。它的范围是数据库。它无法访问 current_user 的原因是因为当前用户没有存储在数据库中,它是一个 session 变量。这与模型完全无关,因为这是没有浏览器不能存在的东西。

ActiveRecord::Base 不是设计用于浏览器的类,它是用于数据库的东西,而且只能用于数据库。您正在使用浏览器作为该模型的接口(interface),但该层需要访问浏览器特定的东西,例如 session 变量,因为您的模型正在扩展一个实际上无法这样做的类。

这不是教条或风格选择。这是您的模型所扩展的类的局限性的事实。这意味着你的选择基本上归结为从其他东西扩展,在你的 Controller 层处理它,或者将它从你的 Controller 层传递给模型。在这种情况下,ActiveRecord 不会执行您想要的操作。

关于ruby-on-rails - 在模型中访问 c​​urrent_user;必须是一种更好的日志记录和身份验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11961351/

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