我认为acts_as_something是一个简单重用的好策略.
是否有一个很好的教程,讨论rails3宝石的这个?我发现有几个讨论rails2(例如http://guides.rubyonrails.org/plugins.html),但这是rails2特有的
这里有一些我已经读过的教程/博客:
> http://guides.rubyonrails.org/plugins.html
> http://www.thoughtsincomputation.com/categories/coding-gems-for-rails-3-tutorials(这是一个很好的开始,但不包括act_as_ *问题或控制器)
谢谢
解决方法
–
我不知道另外一个教程来源,但这里有一些一般的提示.
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
和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
我觉得这里的概念是合理的,之前使用过类似的过程.基本上,它会告诉Rails在生产期间和开发中的每个请求之前执行一次to_prepare块(我们希望这样,因为ApplicationController将在那些时候重新加载,可能会消除我们的钩子方法);钩子就是这样:它为所有控制器(或者更确切地说,扩展ApplicationController的所有控制器)添加了一个钩子,允许用户将真正的“Awesome”代码引入其控制器,而不会影响不需要它的控制器.
#acts_as_awesome钩子本身并不传达Awesome功能.那是因为并非所有控制器都需要此功能.相反,该方法负责通过ActsAsAwesome :: InstanceMethods模块引入真正令人敬畏的东西.这样,用户只有在显式调用acts_as_awesome方法时才会获得Awesome功能.它还向控制器添加了一个before过滤器,以演示此方法中的代码与目标控制器类本身中的代码完全相同.
如果你的目标是模型而不是控制器,这种技术应该完全相同:只需将钩子注入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