Rails问题为对象分配方法

时间:2011-09-13 11:34:10

标签: ruby-on-rails-3 methods

我意识到这是一个新手问题。我正在尝试定义方法unread_notices,然后为current_user调用它。这就是我所拥有的:

module ApplicationHelper
  def unread_notices
    Notice.where("read" => false)
  end

  def current_user
    User.find(session[:user_id])
  end

application.html.erb:

<li><%= link_to "Notices (#{current_user.unread_notices.count})", notices_path %></li>

unread_notices有效,直到我使用current_user对其进行过滤,然后显示undefined method 'unread_notices' for #<User:0x110dd0f48>。有什么想法吗?谢谢。

更新

class User < ActiveRecord::Base
  has_many :notices, :dependent => :destroy

class Notice < ActiveRecord::Base
  belongs_to :user

2 个答案:

答案 0 :(得分:3)

在通知模型中使用范围:

class Notice < ActiveRecord::Base
  belongs_to :user
  scope :unread, where("read" => false)
end

并像这样使用它:

<li><%= link_to "Notices (#{current_user.notices.unread.count})", notices_path %></li>

答案 1 :(得分:1)

关系的名称是'notices'而不是'unread_notices'。为了按用户过滤unread_notices,您可以在User模型中定义范围,如下所示:

Class Notice < AR::Base
  belongs_to :user
  scope :unread_notices, lambda {
    where(:read => false)
  }
end

在此处阅读更多内容:http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html