4

次のように、Railsアクティブモデルメソッドでメソッドを呼び出すと:

class Foo < ActiveRecord::Base

end

Foo.first

最初のアクティブなレコードを取得します。クラスをインスタンス化する必要はありません。

しかし、独自のクラスを作成してメソッドを呼び出すと、例外が発生します。

class Person < ActiveRecord::Base
  def greeting
    'hello'
  end
end

Person.greeting 

#EXCEPTION: undefined method `greeting' for Person:Class

どうすればその問題をなくすことができますか?

4

5 に答える 5

13

方法にはいくつかの種類があります。最も重要なものは、インスタンス メソッドとクラス インスタンス メソッドの 2 つです。

Foo.firstクラスのインスタンスメソッドです。クラスインスタンス(Fooこの場合は )で機能します。クラス内にデータを保存する場合、そのデータはプログラム全体でグローバルに共有されます (名前が Foo (正確には ) のクラスが 1 つしかないため::Foo)。

しかし、あなたのgreetingメソッドはインスタンスメソッドであり、オブジェクトインスタンスが必要です. たとえば、あいさつメソッドで Person の名前を使用する場合、インスタンス データ (名前) を使用できるようにするには、インスタンス メソッドにする必要があります。インスタンス固有の状態を使用せず、本当にクラス インスタンス メソッドであることを意図している場合は、self「プレフィックス」を使用します。

class Person < ActiveRecord::Base
  def self.greeting
    'hello'
  end
end
于 2012-10-25T11:47:39.890 に答える
8

クラスメソッドを試してください:

class Person < ActiveRecord::Base
  def self.greeting
    'hello'
  end
end

または別の構文:

class Person < ActiveRecord::Base
  class << self
    def greeting
      'hello'
    end
  end
end
于 2012-10-25T11:45:26.073 に答える
2
class Person < ActiveRecord::Base
  def Person.greeting
    'hello'
  end
end

動作します。それが何をするかが非常に明確なので、私はそれが好きです。ただし、Person クラスの名前を変更しようとすると、エラーが発生します。

于 2012-10-25T16:24:51.870 に答える
1
class Person < ActiveRecord::Base
    def self.greeting
      'hello'
    end
end
于 2012-10-25T11:46:09.763 に答える
0

静的メソッドを実行するには、これを試してください:

クラス MyModel
    def self.do_something
        puts 「これは静的メソッドです」
    終わり
終わり

MyModel.do_something # => "これは静的メソッドです"
MyModel::do_something # => "これは静的メソッドです"

于 2012-10-25T11:51:18.803 に答える