在我的项目中.rb模型,我试图用一个动态变量创建一个范围:

scope :instanceprojects, lambda { 
    where("projects.instance_id = ?", current_user.instance_id)
} 

我得到以下错误:

undefined local variable or method `current_user' for #<Class:0x102fe3af0>

在控制器中我可以访问current_user.instance_id...是否有模型无法访问它的原因,以及获得访问权限的方法?另外,这是创建上述范围的正确位置,还是属于控制器?

推荐答案

正如你已经指出的,这没有多大意义.当前用户根本不属于模型逻辑,它应该在控制器级别上处理.

但您仍然可以创建这样的作用域,只需将参数从控制器传递给它:

scope :instanceprojects, lambda { |user|
    where("projects.instance_id = ?", user.instance_id)
} 

现在,您可以在控制器中调用它:

Model.instanceprojects(current_user)

Ruby-on-rails相关问答推荐

Rails7--如何使用内联代码仅为操作运行BEFORE操作

ActiveRecord 错误地转义 JSON 字符串

Ruby on Rails 取消首字母大写

如何避免 has_many :through 关系中的重复?

Rails:删除级联与依赖销毁

如何在 Rails 迁移中添加判断约束?

Rails:参数太少

机械师 vs FactoryGirl - 优点和缺点

Rails 4网站图标问题

参数错误:范围主体需要可调用

确认后如何进行设计重定向

如何将 ActionMailer default_url_options 的 :host 动态设置为请求的主机名?

为什么 Ruby on Rails 使用 http://0.0.0.0:3000 而不是 http://localhost:3000?

是否可以设置 travis 来运行多种语言的测试?

活动管理员:仅自定义新表单

Mongoid OR 查询语法

如何强制 RSpec 测试失败?

ActiveRecord 中多列的索引

如何在 Rails 迁移中判断数据库类型?

sass-rails 助手image-url、asset-url在 rails 3.2.1 中不起作用