Ruby / Rails:alias_method实践

时间:2012-05-03 23:15:16

标签: ruby-on-rails ruby rubygems alias-method

我正在尝试覆盖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方法?

干杯...

1 个答案:

答案 0 :(得分:3)

这似乎恰好是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而不修改调用代码/视图。