2012-04-29 13 views
2

私はレールアプリでSorceryライブラリを使用しています。そのモジュールの1つは外部認証用です。そのモジュールにメソッドを追加する必要があります。Ruby:別のファイルからモジュールにメソッドを追加してオートロードする

既存のコードはhereです。メソッドをthis patchから追加します。

私はlib/modulesディレクトリにファイルを追加しました。このファイルは、レールに自動ロードするように指示しました。このファイルはsorcery_extension.rbと呼ばれ、それはこのようになりますされています。これは動作しませんでした

module Sorcery 
    module Controller 
    module Submodules 
     module External 
     module InstanceMethods 
      protected 

      # If user is logged, he can add all available providers into his account 
      def add_provider_to_user(provider) 
      provider_name = provider.to_sym 
      provider = Config.send(provider_name) 
      user_hash = provider.get_user_hash 
      config = user_class.sorcery_config 

      user = current_user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => user_hash[:uid], config.provider_attribute_name => provider) 
      user.save(:validate => false) 

      return user 
      end 
     end 
     end 
    end 
    end 
end 

。私はundefined method errorを私のコントローラ(他の魔法のメソッドを呼び出してうまく動作する)に入れます。

ルビーの私の基本的な理解は、いつでもオブジェクトやモジュールにメソッドを追加できるということです。モジュールのネストをファイルに正しくコピーしたと思います。モジュールファイルの名前を変更する必要はありますか?私はこの種のことをどうやって行うのか本当に分からないので、どんな助けも大歓迎です。ありがとう!

答えて

1

ファイルは決してrequireではありません。

Sorcery::Controller::Submodules::External::InstanceMethods.method_defined?(:add_provider_to_user) 
    # => will return false, you want true 

理由は、定数はRailsが異なるオートロードパスからの自動読み込みにそれをしようとした場合には不明であるときにのみauloadingが起こるということです:あなたは、コンソールに入力することで、これをダブルチェックすることができます。

明示的にファイルを要求する必要があります(たとえば、イニシャライザのファイルから)。物事は期待どおりに機能します。

1

Railsでは、すべてのモジュールで同じ名前のディレクトリを検索する必要があります。あなたの例

module Sorcery 
    module Controller 
    module Submodules 
     module External 
     module InstanceMethods 

あなたがlibディレクトリにモジュールを配置する場合については

。それは「autorequire」Railsは

lib/sorcery/controller/submodules/external/instance_methods.rb 

このパスでそれを期待されるだろうに行くときは、その一般的に良い大会が浅いネストあなたのモジュールを維持する理由はここにあります。 〜2レベルの深さ。

関連する問題