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应该只是使功能可访问.
| 归档时间: |
|
| 查看次数: |
4874 次 |
| 最近记录: |