22

Railsアプリケーションにパスを保存するためにいくつかのクラス変数を設定しようとしています(しかし、これはもっとルビーな質問だと思います)

基本的に私のクラスは次のようになります

class Image < ActiveRecord::Base

   @@path_to_folder = "app/assets"
   @@images_folder = "upimages"
   @@path_to_images = File.join(@@path_to_folder, @@images_folder)

end

しかし@@path_to_images、コントローラーからを実行してアクセスしようとするImage.path_to_imagesと、NoMethodError が発生します。

で試してみるとImage.class_eval( @@path_to_images )uninitialized class variable @@path_to_images in ImagesController

私は周りを検索しましたが、私が見たのはそれらがうまくいくと言っているので、これについて非常に混乱しています

さらに、こんな風にRubyコンソールで簡単なクラスを定義してみました

 class Bidule
     @@foo = "foo"
     Bar = "bar"
 end

それで、私はそれらにアクセスするために可能なすべての方法(前の2つを含む)を試みたと思いますが、常に例外が発生する方法はありません

4

7 に答える 7

24

Rails は、この機能のためのクラス レベルの属性アクセサーを提供します。

試す

class Image < ActiveRecord::Base
  cattr_accessor :path_to_folder
  @@path_to_folder = "app/assets"
end

次に、path_to_folder クラス変数にアクセスするには、次を使用します

Image.path_to_folder

しかし、人々は常に、継承での動作のためにクラス変数を避けることを提案しています.したがって、次のような定数を使用できます

class Image < ActiveRecord::Base
   PATH_TO_FOLDER = "app/assets"
end

次に、次のような定数にアクセスできます

Image::PATH_TO_FOLDER
于 2012-09-25T20:52:04.873 に答える
3

クラスの使用を拡張できない、または拡張したくない場合:

Image.class_variable_get(:@@path_to_images)
于 2015-10-24T14:23:54.110 に答える
2

クラス変数は多くの制限があり、適切なオブジェクト指向設計の粒度に反する傾向があるため、Ruby アプリケーションではめったに使用されません。

ほとんどの場合、クラス変数は、適切な定数、クラス メソッド、またはその両方に置き換えることができます。

あなたの例は、おそらく次のように説明されています。

class Image < ActiveRecord::Base
  PATH_TO_FOLDER = "app/assets"
  IMAGES_FOLDER = "upimages"
  PATH_TO_IMAGES = File.join(PATH_TO_FOLDER, IMAGES_FOLDER)
end

クラス変数は、問題のクラスに対してプライベートであり、サブクラスに細分化されず、外部コンテキストからアクセスするのが困難です。定数を使用すると、次のようなものを使用できます。

image_path = Image::PATH_TO_FOLDER

クラス変数が別の変数よりも合理的な状況がいくつかありますが、通常は非常にまれです。

于 2012-09-25T20:52:03.807 に答える
1

次のように変更します。

class Image < ActiveRecord::Base

  @@path_to_folder = "app/assets"
  @@images_folder = "upimages"
  @@path_to_images = File.join(@@path_to_folder, @@images_folder)

  def initialize
  end 
  ...
  def self.path_to_folder
    @@path_to_folder
  end
end

ここで行ったことは、クラス変数をメソッドにすることです。これで、.method 名の呼び出しを使用してアクセスできるようになります。ただし、これはクラス変数であるため、クラスのインスタンスではなく、クラス自体でのみこれを呼び出すことができます。存在しないメソッドを使用してクラス変数を呼び出しているため、「NoMethodError」が発生しています。上記のコードは、次の行でこのメソッドを定義しています。

def self.path_to_folder
  @@path_to_folder
end

これで動作します:

Image.path_to_folder
于 2016-02-03T07:20:33.703 に答える
1

次のように、クラスメソッドでラップすることでそれを行うことができます。

def self.path_to_images
  @@path_to_images
end

ただし、レールでクラス変数を使用しないようにする必要があることに言及する必要があります

于 2015-02-11T16:08:27.743 に答える