

Railsでファイル名とクラス名が一致していない場合、そのクラスを他のクラスから使うことはできないのでしょうか？

`config/initializers`で`redis.rb`というファイルを設置しています。  
このファイルではクラス`DataCache`を下記のように定義している、redisのユーティリティクラスです。

[code]

    class DataCache
      def self.data
        @data ||= Redis.new(host: 'localhost', port: 6379)
      end
    
      def self.set(key, value)
        data.set(key, value)
      end
    
      def self.get(key)
        data.get(key)
      end
    
      def self.get_i(key)
        data.get(key).to_i
      end
    end
    
[/code]

initializersはオートロードパスに含まれていますが、他のクラスからこのDataCacheクラスを利用しようとすると`uninitialized
constant 他のクラス名::DataCache`と表示されてしまい利用できません。  
ファイル名とクラス名を一致させていない場合のそのクラスの利用方法があれば教えていただきたいです。よろしくお願いします。


CC BY-SA 3.0
2016-02-27T06:06:03.083
22589
2016-04-27T07:59:05.517
12232
question
ruby-on-rails
Railsでファイル名とクラス名が一致していないクラスを読み込む方法


`initializers`配下においてあるのであればクラス名とファイル名が不一致でも問題ないと思います。（クラス階層とフォルダ階層・ファイル名は同じにした方が当然安全ですが）  
手元で適当なrails appを作って試した限りでは、modelからでもcontrollerからでも参照できました。

[code]

    $ cat config/initializers/redis.rb 
    class DataCache
    end
    
    class Todo < ActiveRecord::Base
      validates :todo, presence: true
      validates :todo, length: { maximum: 30 }
      has_many :todo_comments
    
      def self.data
        DataCache.new
      end  
    end
    
    Loading development environment (Rails 4.2.1)
    [1] pry(main)> Todo.data
    => #<DataCache:0x007fbebe5f4a18>
    
[/code]

参照できない可能性として、呼び出している箇所のクラスがmoduleで名前空間が設定されていて、そのmodule配下のクラスとして`DataCache`を探している可能性がありますので、`::DataCache`という形式で参照してみるとどうでしょうか？


CC BY-SA 3.0
2016-02-27T06:44:55.150
22592
2016-02-27T06:44:55.150
2483
22589
answer