rails3 gem:acts_as_something

时间:2010-10-25 20:15:27

标签: ruby-on-rails-3 rubygems

我正在尝试将一些常用代码提取到gem中。

我认为acts_as_something是一种简单重复使用的好策略。

是否有一个很好的教程可以为rails3宝石讨论这个问题?我发现有几个讨论rails2(例如http://guides.rubyonrails.org/plugins.html),但这是特定于rails2

这里有一些我已经读过的教程/博客:

感谢

1 个答案:

答案 0 :(得分: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

和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