Ruby/Rails: alias_method practices



我正在尝试覆盖Rails的"fields_for"方法,我目前正在执行以下操作:

module ActionView::Helpers::FormHelper
  include ActionView::Helpers::FormTagHelper
  alias_method :original_fields_for, :fields_for
  def fields_for(<my arguments>)
    # Some extra stuff
    # ...
    output.safe_concat original_fields_for(<my other arguments>)
  end
end

该功能运行良好,但我开始怀疑我对alias_method的使用并不是最优雅的。最特别的是,如果我将此功能打包到一个 gem 中,并且有另一个 gem 覆盖了fields_for,我是否认为我的新fields_for或备用fields_for将被跳过?

假设是这样,在现有rails方法中加入一些额外功能的正确方法是什么?

干杯。。。

似乎正是alias_method_chain所针对的情况(尽管我不知道它是否适用于模块 - 仅在AR::Base上使用它)

你只会做

module ActionView::Helpers::FormHelper
    include ActionView::Helpers::FormTagHelper
    alias_method_chain :fields_for, :honeypot
    def fields_for_with_honeypot(<my arguments>)
        # Some extra stuff
        # ...
        output.safe_concat fields_for_without_honeypot(<my other arguments>)
    end
end

fields_for这样做很有趣的想法,但它应该有效。

关于你应该注意a_m_c有一个小争议 - 这篇文章总结得很好 http://erniemiller.org/2011/02/03/when-to-use-alias_method_chain/

在这种情况下,我认为您不能使用super因为您想在不修改调用代码/视图的情况下对form_for进行猴子修补。

相关内容

  • 没有找到相关文章

最新更新