gpt4 book ai didi

ruby-on-rails-3 - 模型中默认范围内的参数

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

我正在使用设计来验证用户。我需要根据我所有表中的 global_location_id 列显示/隐藏数据。当前 global_location_id 的值将来自 current_user.global_location_id。我尝试向我的模型之一添加以下默认范围:

class Artifact < ActiveRecord::Base
default_scope where(:global_location_id => current_user.global_location_id)

但它给出了以下错误:
undefined local variable or method `current_user' for #<Class:0x8721840>

为了避免在我添加到我的应用程序 Controller 的模型中 current_user 不可用
class ApplicationController < ActionController::Base
def set_global_location_id
@global_location_id = current_user.global_location_id
end

并从我的 Controller 调用该方法
class ArtifactsController < ApplicationController
#Check to see if the user is logged in first
before_filter :authenticate_user!
before_filter :set_global_location_id

更改模型中的默认范围以添加@global_location_id
class Artifact < ActiveRecord::Base
default_scope where(:global_location_id => @global_location_id)

但这也不起作用。 @global_location_id 正在应用程序 Controller 中正确设置。但它在模型中是空的。如何使它工作。

最佳答案

不幸的是,您将无法与模型实例共享 Controller 中设置的实例变量(没有一些线程技巧)。这实际上是一件好事,因为否则它会像一个全局变量一样,这会给你带来弊大于利。

我实际上很难理解您为什么要这样做,因为它会在当前登录用户的状态和您的模型之间添加一些令人讨厌的耦合。如果您尝试在控制台中查找 Artifact,则 current_user 不存在,并且该实例变量将不可用,因此您会遇到一些严重的问题。

这就是你退后一步,问问自己你真正想要做什么的地方。有什么理由需要根据当前用户的 global_location_id 隐式地设置 default_scope 吗?您可以只创建一个常规范围并在您的 Controller 中使用它吗?

class Artifact < ActiveRecord::Base
scope :by_global_location_id, lambda {|id| where(:global_location_id => id) }
end

class ArtifactsController < ApplicationController
def index
@artifacts = Artifact.by_global_location_id(current_user.global_location_id)
end
end

这种方法的一个好处是,阅读您的代码的人不必花费大量时间来跟踪 default_scope 的工作方式。

关于ruby-on-rails-3 - 模型中默认范围内的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962261/

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