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

时间:2011-07-01 18:26:38

标签: ruby-on-rails ruby-on-rails-3 plugins gem helper

我一直在研究我的第一个Rails 3插件,在我所有应用的ApplicationHelper中打包一个简单的帮助函数。您可以看到整个代码on 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

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

我的问题是:鉴于上面的代码作为我正在寻找的功能的示例,您如何将其转换为Rails 3插件Gem?

谢谢!

1 个答案:

答案 0 :(得分:17)

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

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

# lib/semantic_id/helper.rb

module SemanticId
  module Helper
    def semantic_id
      ...
    end
  end
end

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

# lib/semantic_id.rb

require 'semantic_id/helper'

ActiveSupport.on_load(:action_view) do
  include SemanticId::Helper
end

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

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