我希望能实现像所有伟大的插件在那里为红宝石,这样就可以做到这一点:将参数传递给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