それらをモジュールにラップすることをお勧めします。クラス n モジュールを記述し、モジュールをアプリケーションの/lib
フォルダーに配置します。これは、コントローラー、ビュー、およびモデルでもアクセスできる最適な場所です。Ruby では、モジュールは 3 つの異なる目的で使用されます。まず名前空間です。モジュール内にクラスまたは定数を定義しても、そのモジュール外のクラスまたは定数と衝突することはありません。このようなもの
class Product
def foo
puts 'first'
end
end
module Affiliate
class Product
puts 'second'
end
end
p = Product.new
p.foo # => 'first'
p = Affiliate::Product.new
p.foo # => 'second'
モジュールの 2 番目の使用法は、実際には他に場所がないメソッドを貼り付ける場所としてです。クラス内でもこれを行うことができますが、モジュールを使用すると、コードを読んでいる人に、インスタンス化することを意図していないことがわかります。このようなもの
module Foo
def self.bar
puts 'hi'
end
end
Foo.bar #=> 'hi'
最後に (そして最も紛らわしいのは)、モジュールを他のクラスに含めることができるということです。このようにそれらを使用することは、ミックスインとも呼ばれます。これは、すべてのメソッドを、含めるものに「ミックスイン」しているためです。
module Foo
def bar
puts 'hi'
end
end
class Baz
include Foo
end
b = Baz.new
b.bar #=> 'hi'
ミックスインは、実際には、ここで取り上げるよりもはるかに複雑なトピックですが、深く掘り下げるとおそらく混乱するでしょう。
さて、私には、S3 は実際にはコントローラーに属しているように思えます。なぜなら、コントローラーは通常、着信接続と発信接続を処理するものだからです。その場合は、アプリケーション コントローラーに保護されたメソッドを配置するだけです。これは、他のすべてのコントローラーからアクセスできますが、プライベートであるためです。
モデルにもそれが含まれている正当な理由がある場合は、ミックスインを使用します。何かのようなもの
module AwsUtils
private
def S3
AWS::S3::Base.establish_connection!\
:access_key_id => 'Not telling',
:secret_access_key => 'Really not telling'
data = yield
AWS::S3::Base.disconnect
data
end
end
それを lib/aws_utils.rb に入れると、コントローラーとモデルの両方に include AwsUtils を追加することで使用できるようになります。Rails は、lib でクラスとモジュールを探すことを知っていますが、名前が一致する場合のみ (広い場合) のみです。これを AwsUtils と呼んだのは、それ (aws_utils.rb) を見たときにレールが何を探すかを知っているからです。正直なところ、S3Utils に何が必要なのかわかりません。
モジュールは、Ruby で驚くべきものの 1 つになる傾向がありますが、初心者にとってはまったく困惑します。
この提案がお役に立てば幸いです。ありがとうございます。