Ruby on Rails 3を使用してモジュールを作成および使用する方法


90

Ruby on Rails 3を使用していますが、カスタムコードと共有コードをモジュールに移動したいと考えています。

  1. モジュールコードの記述にはどの構文を使用する必要がありますか?
  2. アプリケーションのどのフォルダにモジュールファイルを配置する必要がありますか?
  3. そのモジュールを1つ以上のコントローラークラスに含めるにはどうすればよいですか?
  4. アプリケーションのどこかでカスタムモジュールを使用する必要がある場合、他にどのようなアクションがありますか?
  5. アプリケーションからモジュールのメソッドを呼び出すにはどうすればよいですか?

前もって感謝します。


2
とても良い!必要でした。
Arup Rakshit 2014

回答:


115

To 1.モジュールは、次のように言うだけで作成/オープンされます。

module MyModule
  def first_module_method
  end
end

へ2. libフォルダー。libフォルダー内でモジュールを整理したい場合は、モジュール自体に配置できます。たとえば、サブフォルダが必要な場合super_modules、モジュールは次のように定義されます。

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

3./5へ。モジュールをクラスに含める場合、クラス内で定義されているかのようにモジュールのメソッドを呼び出すだけです。

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

4.まず、アプリケーションのすべてのクラスでモジュールが本当に必要であることを確認します。そうでない場合は、それを必要としないクラスを膨らませないように、必要な場所にのみ含めるのが理にかなっています。どこでもモジュールが本当に必要な場合は、アプリ内のクラスのクラス階層を確認してください。すべてのモデルでモジュールが必要ですか?ActiveRecord :: Baseを開いて、そこにモジュールを追加します。


2
ファイルを整理するために、「lib」フォルダーにサブフォルダーを作成できますか?もしそうなら、何が変わりますか?
user502052

2
@ user502052その質問に答えるために、回答をポイント2に更新しました。
ステファン

3
ここでは多くのことが不明確です。どのようなファイル名を付けますか?すべてのモジュールが含まれていないときにメソッドを呼び出す方法は?最後にモジュールの使用方法がまだわからないので、賛成票がたくさんあるとは思えません。
オーガスティンリーディンガー2013

5
上記のようにモジュールをlibフォルダーに含めて作成したら、重要な注意事項は、Rails3がconfig\application.rbfor の行のコメントを解除できるようにすることです。config.autoload_pathsたとえば、stackoverflow.com / questions / 1073076 / rails-lib-modules-and ...また、モジュール名自体と一致するモジュールのファイル名を使用するように注意する必要があります。あなたはそれを保存するのであればlib/test/my_module.rb、あなたがする必要がありますinclude Test::MyModule詳細は、参照のために- stackoverflow.com/questions/4073856/rails-3-autoloadを
sameers

6
私はこの古い答えを見つけました。:(私は反対票を投じます。libには何も入れないでください!app/modelsコードが他のモデルにアクセスする必要がある場合は、コード(追加のモジュールを含む)を入れてください。コードが本当に「ライブラリ」であり、独自に存在できる場合は、例として、github.com / shageman / the_next_big_thing
Stephan

3

A> 1。他のルビクラスと同じ構文を使用できます。たとえば、classify_vehicleメソッドを使用して、入力として受け取る車輪の数に基づいて車両を分類するVehicleClassiferモジュールを定義しています。

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2。モジュールは通常/ libフォルダーに保存されます。

質問3、4、5の回答はほぼ同じです。あなたは使うことができます

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

クラスでモジュールを使用しており、モジュールのすべてのメソッドにアクセスできます。

また、アプリ全体でモジュールを使用する必要がある場合は、モジュールをアプリケーションコントローラーに含めることができます。


2
これを試してみたところ、未定義のメソッドエラーが発生しました。私が間違っていることについて何か考えはありますか?
Tony

モジュールにアクセスできることを確認していますか?stackoverflow.com/questions/6604272/…多分あなたを助けますか?
Shreyas

1
@Tony-モジュールのメソッドを利用できるようにするために、サーバーを再起動する必要があるかもしれません-開発モードでもです。また、モジュールのコードを変更するたびに、サーバーを再起動する必要があります。たとえば、エラーの場合、または古いコードでエラーになるが、エラーメッセージでその行の新しいコードを強調表示する-非常にわかりにくい。
JosephK 2016年

内部にこれらのカスタムモジュールを含めて使用する方法はありますApplicationHelperか?
WM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.