Estoy tratando de abstraer parte de la lógica necesaria para recortar imágenes en un módulo para que no estropee mis modelos. El código se basa en http://railscasts.com/episodes/182-cropping-imagesruby include vs extender
module CroppableImage
def croppable_image(*image_names)
image_names.each do |image_name|
define_method "#{image_name}_sizes" do
{ :cropped => read_attribute("#{image_name}_size").to_s, :large => "800x800>" }
end
define_method "#{image_name}_geometry" do |style|
style ||= :original
@geometry ||= {}
@geometry[style] ||= Paperclip::Geometry.from_file(eval "#{image_name}.path(style)")
end
define_method "#{image_name}_aspect_ratio" do
width, height = read_attribute("#{image_name}_size").split("x")
width.to_f/height.to_f
end
private
define_method "reprocess_#{image_name}" do
eval "#{image_name}.reprocess!"
end
end
end
end
Para incluir esto en mi modelo parece que tengo que usar extender. Pensé que extender era para incluir métodos de clase. Soy de origen java. Pensé en usar extender el método estático creado básicamente en la clase.
class Website < ActiveRecord::Base
extend CroppableImage
croppable_image :logo, :footer_image
- esto funciona
Parece entonces que lo que realmente estoy queriendo es crear métodos de instancia.
class Website < ActiveRecord::Base
include CroppableImage
croppable_image :logo, :footer_image
- Esto arroja el error "método no definido` croppable_image' para #"
Puede alguien por favor explicar qué se está encendiendo y si debería estar usando incluyen o extender en este caso. Gracias chicos
'extend' añade los métodos como métodos de clase, mientras que' include' añade los métodos como métodos de instancia. – zeacuss