创建一个添加 rails 表单助手的 Gem

Creating a Gem that adds a rails form helper

我正在创建一个 gem 来为 rails 表单添加一个新的辅助方法。我的 gem 是一个文件

lib/rails_json_field.rb

看起来像这样:

require 'action_view/helpers'
require 'action_view/context'
require 'securerandom'

module ActionView
  module Helpers
    class FormBuilder
      include ActionView::Helpers::FormTagHelper
      include ActionView::Helpers::JavaScriptHelper
      include ActionView::Context

      def json_field_tag(method, options = {})
        #function code here
      end
    end
  end
end

ActiveSupport.on_load(:action_view) do
  include ActionView::Helpers::FormBuilder
end

然而当我使用这样的方法时:

= f.json_field_tag(:some_method)

我收到以下错误:

ActionView::Template::Error (undefined method `json_field_tag' for #<ActionView::Helpers::FormBuilder:0x007ffa84ab52a8>)

如何使方法在 ActionView::Helpers::FormBuilder 上可用?

您定义了以下内容class:

RailsJsonField::ActionView::Helpers::FormBuilder

您打算对以下内容进行 monkeypatch class:

ActionView::Helpers::FormBuilder

这就是错误消息告诉您方法未定义的原因;您在自定义模块中的 class 中定义了它,而不是在指定的 class:

undefined method `json_field_tag' for #<ActionView::Helpers::FormBuilder

它只定义在RailsJsonField::ActionView::Helpers::FormBuilder,所以你得到上面的错误。

如果您想正确地对原始代码进行 monkeypatch,那么您应该查看原始代码以确保 您的 代码看起来像 their code:

module ActionView
  module Helpers
    class FormBuilder
      def json_field_tag(method, options = {})
        # function code here
      end
    end
  end
end

最好将其定义为 Rails 应用程序中的初始值设定项,例如 config/initializers/json_field_tag.rb。一旦你的代码作为一个简单的补丁工作,你就可以专注于将它开发成一个独立的 gem 来增强 ActionView.

经过搜索,我发现了一个不同的 gem 添加了一个 FormBuilder 方法。我使用他们的回购协议作为构建我自己的回购协议的指南。对于其他有此问题的人,您可以分别在此处查看我的 repo 和他们的 repo:

https://github.com/dyeje/rails_json_field

https://github.com/Brantron/john_hancock