Los módulos se utilizan para 3 cosas diferentes en ruby. Primero es el espacio de nombres. Tener definiciones de clase o constantes dentro de un módulo no colisionará con clases o constantes fuera de ese módulo. Algo como esto
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'
El segundo uso para los módulos es como un lugar para aplicar métodos que realmente no tienen cabida en ningún otro lado. También puede hacer esto dentro de una clase, pero usar un módulo le dice a las personas que leen el código que no debe ser instanciado. Algo como esto
module Foo
def self.bar
puts 'hi'
end
end
Foo.bar #=> 'hi'
Finalmente (y lo más confuso) es que los módulos se pueden incluir en otras clases. Usarlos de esta manera también se conoce como mixin, porque estás "mezclando" todos los métodos en lo que sea que incluyas.
module Foo
def bar
puts 'hi'
end
end
class Baz
include Foo
end
b = Baz.new
b.bar #=> 'hi'
Los mixins son en realidad un tema mucho más complejo que el que estoy cubriendo aquí, pero profundizar sería probablemente confuso.
Ahora, para mí, S3 parece ser algo que realmente pertenece al controlador, ya que los controladores suelen ser los que se ocupan de las conexiones entrantes y salientes. Si ese es el caso, simplemente tendría un método protegido en el controlador de la aplicación, ya que será accesible para todos los demás controladores, pero aún así será privado.
Si tiene una buena razón para que también esté en el modelo, me gustaría un mixin. Algo así como
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
si se pone en lib/aws_utils.rb
que, usted debe ser capaz de utilizarlo mediante la adición de include AwsUtils
tanto en el controlador y el modelo. Rails sabe buscar clases y módulos en lib, pero solo si el nombre coincide (en caso amplio).Lo llamé AwsUtils porque sé qué raíles buscará cuando vea eso (aws_utils.rb), y para ser honesto, no tengo idea de lo que necesitará para S3Utils ;-)
No dude en solicitar más información si no tenía claro algo. Los módulos tienden a ser una de esas cosas en rubí que, aunque asombrosas, son francamente desconcertantes para los recién llegados.
Hermosa gracias. Estoy de acuerdo en que esto pertenece al controlador, pero escribí el código original hace algún tiempo antes de saber realmente lo que estaba haciendo. Hay muchas cosas en el modelo que no deberían estar ahí, pero preferiría no reescribirlo ahora mismo. Tu técnica ha funcionado bien y he podido usarla para incluir el método S3 en otro controlador, así que valió la pena. Mi comprensión de los módulos y mixins sigue siendo imperfecta (son confusos, estoy de acuerdo) pero esto me ha ayudado muy bien. – brad