1

/lib私は独自の方法でファイルを持っています。

# lib/file.rb
class File < ApplicationController
  def my_method
    ...
  end
end

ただし、コンソールからメソッドに到達できません

ruby-1.9.2-p290 :044 > File.my_method
NoMethodError: undefined method `my_method' for File:Class

方法はありますか?

4

3 に答える 3

4

my_methodFileクラスのインスタンスメソッドです。Fileこれは、クラスのインスタンスでのみ呼び出すことができることを意味します。

file = File.new
file.my_method

構文my_methodを使用してクラス メソッドとして宣言できます。def self.my_method

class File < ApplicationController
  def self.my_method
    ...
  end
end

File.my_method

Fileただし、クラス メソッドでは、オブジェクトのインスタンス変数を使用できません。

于 2012-05-17T21:14:58.097 に答える
1

クラス メソッドとして呼び出そうとしてmy_methodいますが、インスタンス メソッドとして定義しています。

として定義するかdef self.my_method、コントローラのインスタンスを作成してインスタンス メソッドとして呼び出す必要があります。

さらに、いくつかの理由で問題が発生することになります。(1) Rails はコントローラーに のような名前が付けられることを想定してFilesControllerおり、(2)Fileは標準ライブラリのクラスです。両方の問題を防ぐために、クラス名をFilesControllerに変更し、ファイル自体の名前を に変更することをお勧めします。files_controller.rb

于 2012-05-17T21:15:30.997 に答える
0

ええと...この例ではいくつかの興味深いことが起こっています。1つ目は、このクラス名がFileRubyですでに定義されている呼び出しであるということです。

これが、コンソールを使用しているときに未定義のクラスエラーが発生しなかった理由である可能性があります。my_methodはRubyのクラスで定義されていないためFile、未定義のメソッドが表示されるのはこのためです。

今あなたの質問に。最初にクラスに別の名前を付けて、からもう一度試してみますlib。Rails環境でデフォルトで再度ロードする必要があると思います。1つか2つのバージョンでは、その機能は削除されましたが、元に戻ったと言いたいです。そうでない場合は、config/application.rbファイルに移動して、の行に沿って宣言を探してくださいconfig.autoload_paths。そこにディレクトリを追加libすれば、準備は完了です。

最後に、コントローラーが必要な理由はありますlibか?

于 2012-05-17T21:20:14.287 に答える