访问模型中的rails helper方法

时间:2010-09-22 12:08:46

标签: ruby-on-rails ruby-on-rails-3

在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方法

非常感谢

4 个答案:

答案 0 :(得分:4)

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

#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可能已经改变了。

答案 1 :(得分:2)

关联设置足以处理控制器和视图级别的范围。我认为问题在于范围,例如,在模型中找到。

在控制器中:

@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

这怎么可以作为范围?

答案 2 :(得分:1)

+1标记答案。这应该仍然适用于Rails 3。

只需使用范围和新查询api向您展示rails 3:

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

答案 3 :(得分:0)

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

@projects = current_account.projects.all

...在您的控制器中?

我没有将语法调整为Rails 3样式,因为我自己还在学习它。