7

私は Rails を初めて使用するので、ビューで使用するモジュール ファイルをセットアップしようとしています。したがって、正しい動作は、モジュールをコントローラー内のヘルパーとして定義することであり、出来上がりは機能するはずです。しかし、それは私には当てはまりません。これが構造です。

lib
  functions
    -- form_manager.rb

form_manager.rb:

Module Functions 
  Module FormManager
    def error_message() ...
    end
  end
end 

users_controller.rb

class UsersController < ApplicationController

   helper FormManager

   def new ...

さて、構造は上記のようなもので、そこから error_message を呼び出すと、エラーが表示されnew.html.erbます: uninitialized constant UsersController::FormManager

まず、Rails 3 では lib が自動的に読み込まれないことを知っています。lib フォルダーを自動ロードすることは必須ではないと仮定すると、どうすればこれを機能させることができ、何が欠けていますか?

ところで、この質問が重複しているとは言わないでください。私はこのがらくたをほぼ2日間探していたと言っています。

4

2 に答える 2

14

あなたのモジュールは自動ロードされていません (少なくとも 3.2.6 ではそうではありません)。明示的にロードする必要があります。これは、次のコード行で実現できます

 # in application.rb
 config.autoload_paths += %W(#{config.root}/lib)

でオートロード パスを確認できますRails.application.config.autoload_paths。多分それは本当にあなたのために定義されていますか?

モジュールがロードされたことを確認したら、rails console呼び出してチェックインできます

> Functions::FormHelper

デフォルトでは、そのモジュールをビュー ヘルパーとして使用することはできません。#includedモジュールがインクルードされるときにヘルパーを定義するために使用します。このようにして「遅延評価」を実現します。あなたのコードの問題はhelper、モジュールが含まれる前にメソッドが呼び出されることだと思います。(間違っていたら誰か訂正してください)

コードは次のとおりです。

Module Functions 
  Module FormManager
    def error_message() ...
    end

    def self.included m
      return unless m < ActionController::Base
      m.helper_method :error_message
    end

  end
end 

また、コントローラーからこの行を削除する必要がありhelperます。

編集:

これは、オートロードなしで実現できます。を使用するだけrequire "functions/form_manager"です。すべてのメソッドに対して helper_method を定義します。ヘルパーが使用するすべてのモジュールメソッドを使用する場合

def self.included m
  return unless m < ActionController::Base
  m.helper_method self.instance_methods
end

EDIT2:

を使用する必要はないようself.includedです。これにより、同じ機能が実現されます。

class ApplicationController < ActionController::Base

  include Functions::FormManager
  helper_method Functions::FormManager.instance_methods

end
于 2012-06-15T16:28:19.337 に答える
0

FormManager内部で名前空間を使用しているようですFunctions。つまり、helper Functions::FormManager

それを試してみてください

于 2012-06-15T16:00:00.470 に答える