cbr*_*lak 7 rubygems ruby-on-rails-3
我正在尝试将一些常见代码提取到gem中.
我认为这acts_as_something是一个简单重复使用的好策略.
是否有一个很好的教程,讨论rails3宝石的这个?我发现有几个讨论rails2(例如http://guides.rubyonrails.org/plugins.html),但这是特定于rails2
这里有一些我已经读过的教程/博客:
谢谢
sin*_*unk 12
更新:我根据这个答案添加了一篇博客文章,但更多细节:http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3
-
我不知道另外一个教程来源,但这里有一些一般的提示.
Rails 3使用了一个名为Railtie的非常有用的功能 - 请参阅http://api.rubyonrails.org/classes/Rails/Railtie.html.
所以,如果我实现了一个acts_as_*gem,我就会从那里开始.我的铁路可能看起来像:
# lib/acts_as_awesome/railtie.rb
require 'rails'
require 'acts_as_awesome'
module ActsAsAwesome
class Railtie < Rails::Railtie
config.to_prepare do
ApplicationController.send(:extend, ActsAsAwesome::Hook)
end
end
end
Run Code Online (Sandbox Code Playgroud)
和ActsAsAwesome :: Hook代码:
# lib/acts_as_awesome/hook.rb
module ActsAsAwesome::Hook
def acts_as_awesome(*args)
options = args.extract_options!
# do the things that make the controller awesome.
include ActsAsAwesome::InstanceMethods
before_filter :an_awesome_filter
end
end
Run Code Online (Sandbox Code Playgroud)
我觉得这里的概念是合理的,之前使用过类似的过程.基本上,它会告诉Rails在生产期间和开发中的每个请求之前执行一次to_prepare块(我们希望这样,因为ApplicationController将在那些时候重新加载,可能会消除我们的钩子方法); 钩子就是这样:它为所有控制器(或者更确切地说,扩展ApplicationController的所有控制器)添加一个钩子,以允许用户将真正的"Awesome"代码引入其控制器,而不会影响不需要它的控制器.
#acts_as_awesome钩子本身并不传达Awesome功能.那是因为并非所有控制器都需要此功能.相反,该方法负责通过ActsAsAwesome :: InstanceMethods模块引入真正令人敬畏的东西.这样,用户只有在显式调用acts_as_awesome方法时才会获得Awesome功能.它还向控制器添加了一个前置过滤器,以演示此方法中的代码将与目标控制器类本身中的代码完全相同.
如果你的目标是模型而不是控制器,这种技术应该完全相同:只需将钩子注入ActiveRecord :: Base即可.由于AR:B仅在Rails启动时加载,您应该可以将其放入初始化程序(请参阅Railtie文档),但我保留在此处被误解的权利.
关于铁路的问题:文档读起来好像它应该被自动检测,但我经常遇到这个问题.要绕过它,只需要从gem的主要源文件中获取railtie(在上面的示例中,这将是lib/acts_as_awesome.rb).
您可以在我的github帐户中查看整个ActsAsAwesome源代码:http://github.com/sinisterchipmunk/acts_as_awesome
我希望这是有帮助的.你的问题有点高级,所以我能做的最好的答案就是高级别.
-Colin MacKenzie IV
http://thoughtsincomputation.com
@sinisterchipmnk
| 归档时间: |
|
| 查看次数: |
2046 次 |
| 最近记录: |