Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 了解Rails模型的寿命';s类属性_Ruby On Rails_Ruby_Lifecycle_Class Attributes - Fatal编程技术网

Ruby on rails 了解Rails模型的寿命';s类属性

Ruby on rails 了解Rails模型的寿命';s类属性,ruby-on-rails,ruby,lifecycle,class-attributes,Ruby On Rails,Ruby,Lifecycle,Class Attributes,正在寻找在Rails模型中进行所有权验证的最佳方法,而不会使控制器膨胀。这意味着我需要以某种方式将当前用户传递给模型 当前,我正在每个请求开始时将用户模型上的class属性设置为当前_用户: class User < ActiveRecord::Base cattr_accessor :current_user end class ApplicationController < ActionController::Base before_filter :set_curre

正在寻找在Rails模型中进行所有权验证的最佳方法,而不会使控制器膨胀。这意味着我需要以某种方式将当前用户传递给模型

当前,我正在每个请求开始时将用户模型上的class属性设置为当前_用户:

class User < ActiveRecord::Base
  cattr_accessor :current_user
end

class ApplicationController < ActionController::Base
   before_filter :set_current_user
   def set_current_user
     User.current_user = current_user
   end
end
class用户
我不确定我是否完全理解此场景中User.current_用户的生存期。该值是否可能在请求期间更改


我主要想知道上述方法是否安全使用,以及是否有更好的方法。

如果您想遵守最佳实践,这绝对是正确的方法
current_user
是一种控制器方法,通过遵循该模式,
用户
模型应该不知道当前用户是谁。

如果您想符合最佳实践,这绝对是正确的方法
current_user
是一种控制器方法,通过遵循该模式,
user
模型不应该知道当前用户是谁。

这不是一种安全的方法:)将您的状态保留在控制器中,并在模型中保留业务逻辑

如果当前用户需要传递到模型层,那么模型不应该关心这是谁。您可以始终使用关联来筛选对内容的访问


current_user.widgets.find(params[:id])
这不是一种安全的方法:)将您的状态保存在控制器中,并在模型中保存业务逻辑

如果当前用户需要传递到模型层,那么模型不应该关心这是谁。您可以始终使用关联来筛选对内容的访问


当前用户.widgets.find(params[:id])
回答问题的第一部分。该属性将保存在内存中,直到用户类被刷新/发送到垃圾收集器。这通常是VM或解释器关闭的时候


在Heroku这样的环境中,此变量可以存储在请求之间,未经身份验证的用户可以通过访问此变量来访问最近的用户,除非在第一个用户完成后清除此变量。

回答问题的第一部分。该属性将保存在内存中,直到用户类被刷新/发送到垃圾收集器。这通常是VM或解释器关闭的时候



在像Heroku这样的环境中,此变量可以存储在请求之间,未经身份验证的用户可以通过访问此变量访问最近的用户,除非在第一个用户完成时将其清除。

您这样说很有趣,因为OP告诉用户模型存储当前用户。谢谢。。。但我更关心的是一生。。。在请求过程中,值是否可能发生变化?这是错误的。你把一个国家藏到了一个不应该的地方。如果有人在请求过程中更改了当前用户,该怎么办。那么这两个变量将不同步。@theodorton这是一个有效点。尽管如此,我仍然认为在任何情况下都不会发生这种情况。你这么说很有趣,因为OP告诉用户模型存储当前用户是谁。谢谢。。。但我更关心的是一生。。。在请求过程中,值是否可能发生变化?这是错误的。你把一个国家藏到了一个不应该的地方。如果有人在请求过程中更改了当前用户,该怎么办。那么这两个变量将不同步。@theodorton这是一个有效点。尽管如此,我想不出在什么情况下会发生这种事。我相信你弄错了。这不是为了实际存储任何状态;它实际上是用于业务逻辑的。这允许我在更新时检查模型内部的所有权。例如,在后期模型验证中:self.user_id==user.current_users,应该进入控制器。它们限制访问,而不是模型本身。您可以通过重构控制器上的更新方法来实现这一点,在has_多关联上使用find。我知道这是一件宗教的事情,无论这是否被视为业务逻辑,但我相信这是一件宗教的事情。我可以在Post中创建一个方法,例如:def is_owner?(user)并在控制器中使用该方法,但在每个操作中都要这样做非常繁琐。@tybro0103保存时,您的属性也必须以某种方式传递到模型中,也许您应该将整个模型移动到控制器中?这应该会让事情变得更容易。(当然,这是一种讽刺,试图说明证明这一点违背了MVC的全部目的。)您如何处理编辑操作?重定向,除非模型有效?授权和身份验证是控制器域,而不是模型。我想说清楚的原因是,如果其他人在谷歌上搜索这个,他们会知道:)我相信你搞错了。这不是为了实际存储任何状态;它实际上是用于业务逻辑的。这允许我在更新时检查模型内部的所有权。例如,在后期模型验证中:self.user_id==user.current_users,应该进入控制器。它们限制访问,而不是模型本身。您可以通过重构控制器上的更新方法来实现这一点,在has_多关联上使用find。我知道这是一件宗教的事情,无论这是否被视为业务逻辑,但我相信这是一件宗教的事情。我可以在Post中创建一个方法,例如:def is_owner?(user)并在控制器中使用该方法,但在每个操作中都要这样做非常繁琐。@tybro0103保存时,您的属性也必须以某种方式传递到模型中,也许您应该将整个模型移动到控制器中?这应该会让事情变得更容易。(