Кроме того, что ваши разработчики по обслуживанию мозгов страдают, я не вижу никакого преимущества в этом.
Насколько я понимаю, весь этот код создает метод экземпляра во включающем классе с именем attribute_name_authenticated_url
, который является просто оболочкой для authenticated_url_for.
Вы могли бы легко сделать то же самое, используя method_missing
или определив и вызвав метод класса, который создает ваш метод экземпляра. ИМО, этот подход намного проще и удобочитаемее:
module Concerns
module AuthenticatedS3
def authenticated_url_for(attached_file, time_limit = 7.days)
AWS::S3::S3Object.url_for(self.send(attached_file).path('original'), self.send(attached_file).bucket_name, :expires_in => time_limit)
end
end
end
class Attachment
include Concerns::AuthenticatedS3
end
@attachment = Attachment.new
@attachment.authenticated_url_for(:attribute_name)
Метапрограммирование лучше всего подходит, когда оно не мешает тому, что вы пытаетесь сделать.