【问题标题】:Writing Rails Gems: Proper way to add to existing rails modules?编写 Rails Gems:添加到现有 Rails 模块的正确方法?
【发布时间】:2012-03-21 08:54:13
【问题描述】:

我刚刚开始使用 rails gems,想知道如何最好地向现有的 rails 模块添加功能。例如,如果我想添加一个新的表单助手,我通常会这样做:

class ActionView::Helpers::FormBuilder
  # My form defs in here
end

但我想知道这是否是最优雅的做事方式 - 尤其是如果,例如,我要将新功能包装在一个 gem 中。

例如,假设我正在创建 gem“MyGem”,并且我只希望它的功能在控制器中调用 gem 时出现。所以在控制器中我添加了'include MyGem',在 lib/my_gem.rb 我通常会做类似的事情:

# lib/my_gem.rb
module MyGem
  # My form defs in here
end

问题是:从 MyGem 模块中覆盖 ActionView::Helpers::FormBuilder 模块中的 defs 的标准方法是什么?

干杯...

【问题讨论】:

    标签: ruby-on-rails ruby gem


    【解决方案1】:

    如果您创建一个继承 ActionView::Helpers::FormBuilder 的类,您可以覆盖您想要的 FormBuilder 中的所有方法。

    您也可以添加其他方法。

    当您使用选项:builder 创建表单时只需要使用此FormBuilder 或者您可以使用simple_form_for 之类的辅助方法来使用您的构建器调用form_for 方法。

    如果你想在一个模块中做,你需要在模块中创建你的类

    # lib/my_gem.rb
    require 'my_gem/form_builder'
    
    # lib/my_gem/form_builder.rb
    module MyGem
      class FormBuilder < ActionView::Helpers::FormBuilder
        # form def
      end
    end
    

    在您的构建器中,您使用:builder =&gt; MyGem::FormBuilder

    【讨论】:

    • 嗨 shingara - 感谢您的快速回复。它在从 ::FormBuilder 等类继承时效果很好,但在(例如)ActionView::Helpers::FormHelper 等模块中,方法未包装在类中,我得到了旧的“错误参数类型”模块(预期类)”。这就是最初让我失望的原因——也许我的问题是如何从没有类的模块中继承方法?
    • PS:只是为了抢占先机:对 ::FormHelper 感兴趣,用于修改'form_for'。我知道内部构建器应该在 ::FormBuilder 中进行修改。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多