我希望为 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
哈希值从该辅助方法传递到主力模块。那可能吗?这样,主力模块可以定义各种功能,但我可以在运行时随意命名变量。 最佳答案
您可能想查看 Modularity gem,它完全符合您的要求。
关于ruby - 将参数传递给 Ruby 中包含的模块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2490699/