创建一个简单的Rails 3文本助手Gem

And*_*rew 11 gem plugins ruby-on-rails helper ruby-on-rails-3

我一直在研究我的第一个Rails 3插件,打包一个简单的帮助函数,我喜欢在ApplicationHelper我的所有应用程序中使用它.你可以在Github上看到整个代码.

这是我的第一次尝试:

## lib/semantic_id.rb ##

require 'semantic_id/version'

module ::ActionView::Helpers::TextHelper

  def semantic_id
    string = String.new

    case
    when controller.action_name =~ /new|edit/
      string += controller.action_name + "_"
    when controller.action_name =~ /index|create/
      string += controller.controller_name
    else
      string += controller.controller_name.singularize
    end

    string += "_view"
  end

end
Run Code Online (Sandbox Code Playgroud)

现在,这可行,但据我所知,这不是扩展ActiveSupport或任何其他Rails模块的'Rails 3方式'.我还没有找到很多关于你如何"应该"构建Rails 3 gem的文档.我试过按照Rails指南,但那里添加助手的方法不起作用,否则我错过了一些东西.

我的问题是:鉴于上面的代码作为我正在寻找的功能的一个例子,你将如何把它变成一个Rails 3插件Gem?

谢谢!

Ale*_*ner 17

您所做的事情的问题在于您已将gem的功能绑定到ActionView.最好让它更通用.

要解决此问题,您应该将代码打包在自己的模块中,然后将该模块注入到视图环境中.例如,将您的帮助程序放入其自己的模块(和文件)中:

# lib/semantic_id/helper.rb

module SemanticId
  module Helper
    def semantic_id
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后使用Railtie将其添加到ActionView:

# lib/semantic_id.rb

require 'semantic_id/helper'

ActiveSupport.on_load(:action_view) do
  include SemanticId::Helper
end
Run Code Online (Sandbox Code Playgroud)

您希望将帮助程序的功能部分与将其插入框架的部分分开.您的方法包含一些特定于Rails的代码,但如果没有,这种技术将允许您将它与Sinatra和其他框架一起使用.

通常,项目的内容应该在lib/<project_name>/*.rb,并且lib/<project_name>.rb应该只是使功能可访问.