Я надеюсь реализовать что-то вроде всех великолепных плагинов там для ruby, чтобы вы могли это сделать:
acts_as_commentable
has_attached_file :avatar
Но у меня есть одно ограничение:
Этот вспомогательный метод может включать только модуль; он не может определить какие-либо переменные или методы.
Причина этого заключается в том, что я хочу, чтобы хэш параметров определял что-то вроде type
, и это могло быть преобразовано в один из 20 различных модулей "рабочая лошадка", все из которых я мог бы суммировать в строке типа это:
def dynamic_method(options = {})
include ("My::Helpers::#{options[:type].to_s.camelize}").constantize(options)
end
Тогда эти "рабочие лошадки" будут обрабатывать варианты, делая такие вещи, как:
has_many "#{options[:something]}"
Вот как выглядит структура, и мне интересно, знаете ли вы недостающую часть в головоломке:
# 1 - The workhorse, encapsuling all dynamic variables
module My::Module
def self.included(base)
base.extend ClassMethods
base.class_eval do
include InstanceMethods
end
end
module InstanceMethods
self.instance_eval %Q?
def #{options[:my_method]}
"world!"
end
?
end
module ClassMethods
end
end
# 2 - all this does is define that helper method
module HelperModule
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def dynamic_method(options = {})
# don't know how to get options through!
include My::Module(options)
end
end
end
# 3 - send it to active_record
ActiveRecord::Base.send(:include, HelperModule)
# 4 - what it looks like
class TestClass < ActiveRecord::Base
dynamic_method :my_method => "hello"
end
puts TestClass.new.hello #=> "world!"
Это %Q?
Я не совсем уверен, как использовать, но я просто хочу как-то передать хеш options
из этого вспомогательного метода в модуль рабочей лошади. Это возможно? Таким образом, модуль рабочей лошадки мог бы определять всевозможные функциональные возможности, но я мог бы назвать переменные, которые мне нужны во время выполнения.