我正在搞乱创建rails gem而且我在向ActiveRecord添加方法时遇到了麻烦。假设我想做以下事情:
class DemoModel < ActiveRecord::Base
custom_method :first_argument, :second_argument
end
为了使这项工作,我提出以下内容:
module DemoMethod
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def custom_method(*fields)
@my_fields = fields
end
end
end
ActiveRecord::Base.send(:include, DemoMethod)
到目前为止,非常好。
问题是,我想从模型实例访问my_fields变量。例如,我可能用以下内容打开form_for:
module ActionView::Helpers::FormHelper
def fields_for(record_name, record_object, options = {}, &block)
the_fields = record_object.<I WANNA ACCESS @my_fields HERE!!!>.html_safe
# ...
end
end
难点在于,'custom_method'似乎只有在我将帮助器设置为类方法时才有效,但这意味着.self现在是Model(DemoModel)而不是我想要工作的DemoModel对象。我可以使用“custom_method self,:first_argument,:second_argument”手动传递对象,但是让我的精彩“custom_method”gem的用户必须将“self”添加到他们的参数列表中似乎有点笨拙。 / p>
所以,问题是,一个更聪明的Rails人如何通过custom_method为特定对象设置值,然后在其他地方检索它们,比如fields_for?
一如既往,任何建议都值得赞赏。
答案 0 :(得分:2)
使用self.included
和ClassMethods
将方法添加为类方法。
通常在模块中定义方法,然后包含它们,是创建普通实例方法的方法。像这样:
module DemoMethod
def custom_method(*fields)
@my_fields = fields
end
end
ActiveRecord::Base.send(:include, DemoMethod)