5

Ruby on Rails 3.2.2を使用していますが、モデル/クラスからいくつかのメソッドを「抽出」したいと思います。つまり、複数のクラス/モデルに、実質的に同じで機能するいくつかのメソッドがあります(注:メソッドはユーザー認証に関連しており、「CRUDウェイ」と呼ばれます)。そのため、DRYのアプローチは、これらのメソッドを「共有」モジュールなどに配置することだと思いました。

それを達成するための一般的で正しい方法は何ですか?たとえば、「共有」コードをどこに(どのディレクトリとファイルに)配置する必要がありますか?言及したメソッドをクラス/モデルに含めるにはどうすればよいですか?何についてアドバイスしますか?

:「RubyonRailsWayで物を作る」を探しています。

4

2 に答える 2

8

一般的なアプローチの1つは、ActiveSupportの懸念事項を使用することです。次に、共通ロジックを通常はディレクトリの下に配置しapp/concerns/ますapp/models/concerns/(好みに応じて)。実例:

# app/concerns/mooable.rb
module Mooable
  extend ActiveSupport::Concern

  included do
    before_create :say_moo

    self.mooables
      where(can_moo: true)
    end
  end

  private

  def say_moo
    puts "Moo!"
  end
end

そしてモデルでは:

# app/models/cow.rb
class Cow < ActiveRecord::Base
  include Mooable
end

このように機能させるには、次の行をに追加する必要がありますconfig/application.rb

config.autoload_paths += %W(#{config.root}/app/concerns)

詳しくは:

于 2012-09-18T16:00:47.427 に答える
1

私の答えはRoRとは直接関係ありませんが、Rubyとはもっと関係があります。

一般的なコードのシュレーディングは、Rubyではさまざまな方法で実行できます。私の意見では、最も明白な方法は、コードを含むRubyモジュールを作成し、それらをクラス/モデル内に含めることです。これらの共有モジュールは、多くの場合、アプリルートのlibディレクトリの下にあります。例えば:

# lib/authorizable.rb

module Authorizable
  def method1
     #some logic here
  end

  def method2
     #some more logic here
  end
end

# app/models/user.rb

 class User < ActiveRecord::Base
    include Authorizable
 end

Userクラスは、Authorizableモジュールに属するmethod1とmethod2を呼び出すことができます。このモジュールは、他の任意のRubyクラスに含めることができます。これにより、コードをDRYできます。

于 2012-09-18T15:55:39.897 に答える