ruby-on-rails-3 – rails3 gem:acts_as_something

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – rails3 gem:acts_as_something前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将一些常见代码提取到gem中.

我认为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_ *问题或控制器)

谢谢

解决方法

更新:我根据这个答案添加了一篇博文,但更详细: 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

和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

猜你在找的Ruby相关文章