用于轨道模型的“未定义方法”

时间:2011-10-26 09:41:29

标签: ruby ruby-on-rails-3

我正在使用带有rails的Devise,我想添加一个方法“getAllComments”,所以我写这个:

    class User < ActiveRecord::Base
      # Include default devise modules. Others available are:
      # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable

      # Setup accessible (or protected) attributes for your model
      attr_accessible :email, :password, :password_confirmation, :remember_me, :city, :newsletter_register, :birthday, :postal_code,
          :address_complement, :address, :lastname, :firstname, :civility

      has_many :hotels_comments

      class << self # Class methods
          def getAllComments
             true
          end
      end
    end

在我的控制器中:

def dashboard
  @user = current_user
  @comments = @user.getAllComments();
end

当我去我的网址时,我得到了

 undefined method `getAllComments' for #<User:0x00000008759718>

我做错了什么?

谢谢

4 个答案:

答案 0 :(得分:9)

因为getAllComments是一个类方法,并且您尝试将其作为实例方法进行访问。

您需要以下列方式访问它:

User.getAllComments

或将其重新定义为实例方法:

class User < ActiveRecord::Base
  #...

  def getAllComments
    true
  end
end

def dashboard
  @user = current_user
  @comments = @user.getAllComments
end

答案 1 :(得分:1)

正如我所看到的,你将getAllComments作为类方法添加到eigenclass中。并且您尝试从实例调用此方法。

答案 2 :(得分:0)

class << self的内容表示类方法。它可以缩短为def self.getAllComments

您应该将其称为User.getAllComments而不是@user.getAllComments

答案 3 :(得分:0)

您编写的getAllComments()方法是类方法

所以调用方法的正确方法是

@comments = User.getAllComments

但是如果你真的想将getAllComments的范围扩展到当前用户,我建议你编写一个实例方法

class User < ActiveRecord::Base
  ..
  def getAllComments
    // comments implementation
  end

这样你可以像这样访问getAllComments方法:

 @user = current_user
 @comments = @user.getAllComments