我希望能實現像所有偉大的插件在那裏爲紅寶石,這樣就可以做到這一點:將參數傳遞給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?
我不完全知道如何使用,但我基本上只是想以某種方式能夠從helper方法通過options
散列成主力模塊。那可能嗎?這樣,workhorse模塊可以定義各種功能,但是我可以在運行時爲變量命名。
你能詳細說明在這種情況下這可能會有什麼幫助嗎?這可能是顯而易見的,但在這個網站上的好答案包括這類信息。一個沒有解釋的指針並不是一個真正的答案.... – GreenAsJade 2014-02-14 23:56:08
它是acts_as對於ruby類的DSL。您可以將字段和選項傳遞給action(模塊),例如acts_as_searchable:title,ignorecase:true – 2014-02-15 00:25:18