繁体   English   中英

访问模型中的Rails助手方法

[英]Accessing rails helper methods in models

在Rails 3中,从模型内部访问辅助方法时遇到问题

在我的ApplicationController中,我有一个名为current_account的帮助程序方法,该方法返回与当前登录用户关联的帐户。 我有一个项目模型,其中包含与该帐户关联的项目。 我在项目模型中指定了“ belongs_to:account”,在帐户模型中指定了“ has_many”。 所有这些似乎都工作正常,并且我的项目与正确的帐户相关联。

但是,当我使用“ Project.all”时,所有的项目记录都将按照您的期望返回。 我希望它可以自动过滤项目,以便仅返回与指定帐户相关联的项目,并且我希望这是默认行为

所以我尝试使用“ default_scope”。 我模型中的线看起来像这样

default_scope :order => :name, :conditions => ['account_id = ?', current_account.id]

这引发了一个错误说

#的未定义局部变量或方法current_account

如果我将呼叫交换到current_account.id以获取整数ID-例如

default_scope :order => :name, :conditions => ['account_id = ?', 1]

一切正常。 如何使我的模型可以访问current_account方法

非常感谢

您无法从模型访问会话。 而是将帐户作为参数传递给命名范围。

#controller
Model.my_custom_find current_account

#model.rb

named_scope :my_custom_find, lambda { |account| { :order => :name, :conditions => ['account_id = ?', account.id]}}

我还没有使用过rails 3,所以named_scopes可能已更改。

关联设置足以应付控制器和视图级别的作用域。 我认为问题在于范围,例如,在模型中查找。

在控制器中:

@products = current_account.products.all

很好的视图范围,但...

在模型中:

class Inventory < ActiveRecord::Base
  belongs_to :account # has fk account_id
  has_many :inventory_items, :dependent => :destroy
  has_many :products, :through => :inventory_items
end

class Product < ActiveRecord::Base
  has_many :inventory_items

  def level_in(inventory_id)
    inventory_items.where(:inventory_id => inventory_id).size
  end

  def total_level
    # Inventory.where(:account_id => ?????) <<<<<< ISSUE HERE!!!! 
    Inventory.sum { |inventory| level_in(inventory.id) }
  end
end

如何确定范围?

+1为马克的答案。 在Rails 3中仍然可以使用。

仅向您展示使用范围和新查询API的Rails 3方式:

scope :my_custom_find, lambda { |account| where(:account_id=>account.id).order(:name) }

您已经建立了关联,所以您不能只使用:

@projects = current_account.projects.all

...在您的控制器中?

我尚未将语法调整为Rails 3风格,因为我仍在自己学习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM