Ruby on rails 编写Rails Gems:添加到现有Rails模块的正确方法?

Ruby on rails 编写Rails Gems:添加到现有Rails模块的正确方法?,ruby-on-rails,ruby,gem,Ruby On Rails,Ruby,Gem,我刚刚开始学习rails gems,想知道如何最好地向现有rails模块添加功能。例如,如果我想添加一个新的表单助手,我通常会这样做: class ActionView::Helpers::FormBuilder # My form defs in here end 但我想知道这是否是最优雅的做事方式——特别是如果,例如,我打算将新功能包装在一个gem中 例如,假设我正在创建gem“MyGem”,并且我只希望在控制器中调用gem时它的功能才出现。因此,在控制器中,我添加了“include

我刚刚开始学习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模块中的DEF的标准方法是什么


干杯…

如果创建继承了
ActionView::Helpers::FormBuilder
的类,则可以覆盖FormBuilder中的所有方法

您也可以添加其他方法

使用选项
:builder
创建表单时,您只需使用此FormBuilder,或者您可以使用类似
simple\u form\u for
这样的帮助器方法来调用生成器的
form\u 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
#lib/my_gem.rb
需要“我的宝石/表格生成器”
#lib/my\u gem/form\u builder.rb
模块MyGem
类FormBuilder

在您的生成器中,您使用的是
:builder=>MyGem::FormBuilder

Hi shingara-感谢您的快速响应。当从诸如::FormBuilder之类的类继承时,它工作得很好,但在诸如(例如)ActionView::Helpers::FormHelper之类的模块中,如果方法没有包装在类中,我会得到一个好的旧“错误参数类型模块(预期类)”。这正是最初让我感到不快的地方——也许我的问题是如何从没有类的模块中的方法继承?PS:只是为了抢先:对::FormHelper感兴趣,以便修改“form_For”。我知道应该在::FormBuilder中修改内部生成器。;-)