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

时间:2017-11-20 05:41:05

标签: ruby-on-rails ruby rubygems

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

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上提供该方法?

2 个答案:

答案 0 :(得分:1)

您已定义以下类:

RailsJsonField::ActionView::Helpers::FormBuilder

你的意思是monkeypatch以下类:

ActionView::Helpers::FormBuilder

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

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

它仅在RailsJsonField::ActionView::Helpers::FormBuilder中定义,因此您会收到上述错误。

如果您想要正确编码原始代码,那么您应该查看原始代码,以确保您的代码看起来像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。一旦您将代码作为一个简单的补丁工作,那么您可以专注于将其开发为一个增强ActionView的独立gem。

答案 1 :(得分:0)

搜索之后,我找到了一个不同的宝石,它添加了一个FormBuilder方法。我用他们的回购作为指导我自己的结构。对于有这个问题的其他人,您可以分别在这里查看我的回购及其回购:

https://github.com/dyeje/rails_json_field

https://github.com/Brantron/john_hancock