我一直在研究我的第一个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?
谢谢!
答案 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
应该只是使功能可以访问。