Spero di implementare qualcosa di simile a tutte le grandi plugin là fuori per rubino, in modo che si può fare questo:Passa gli argomenti al modulo incluso in Ruby?
acts_as_commentable
has_attached_file :avatar
Ma io ho un vincolo:
Questo metodo di supporto può includere solo un modulo; non può definire alcuna variabile o metodo.
La ragione di questo è perché, voglio che le opzioni di hash per definire qualcosa come type
, e che potrebbe essere convertito in una delle dicono 20 moduli diversi 'cavallo di battaglia', ognuno dei quali potessi riassumere in una linea in questo modo:
def dynamic_method(options = {})
include ("My::Helpers::#{options[:type].to_s.camelize}").constantize(options)
end
Poi quelle 'cavalli di lavoro' sarebbe gestire le opzioni, fare le cose come:
has_many "#{options[:something]}"
Ecco cosa la struttura assomiglia, e mi chiedo se si sa t egli pezzo mancante del puzzle:
# 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!"
Che %Q?
io non sono del tutto sicuro di come usare, ma io sono fondamentalmente solo voler essere in qualche modo in grado di passare il options
hash da quel metodo di supporto nel modulo cavallo di battaglia . È possibile? In questo modo, il modulo workhorse poteva definire tutti i tipi di funzionalità, ma potevo nominare le variabili come volevo al runtime.
Puoi approfondire come questo potrebbe essere d'aiuto in questo caso?Potrebbe essere ovvio per te, ma le buone risposte su questo sito includono questo tipo di informazioni. Un puntatore senza una spiegazione non è in realtà una risposta .... – GreenAsJade
It's acts_as DSL for ruby class. Puoi passare campi e opzioni in azione (modulo), ad esempio act_as_searchable: title, ignorecase: true –