代码之家  ›  专栏  ›  技术社区  ›  cbrulak

rails3 gem:充当什么东西

  •  7
  • cbrulak  · 技术社区  · 15 年前

    我想把一些常见的代码提取到gem中。

    我在想 acts_as_something 是简单重复使用的好策略。

    有没有一个很好的教程来讨论rails3 gems?我找到了几个讨论铁路的人(比如 http://guides.rubyonrails.org/plugins.html

    以下是我已经读过的一些教程/博客:

    1 回复  |  直到 15 年前
        1
  •  12
  •   sinisterchipmunk    15 年前

    更新:我根据这个答案添加了一篇博文,但更多细节: http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3

    我不知道另一个教程的来源在我的头顶上,但这里有一些一般的提示。

    Rails 3使用了一个非常有用的特性,叫做Railtie-see http://api.rubyonrails.org/classes/Rails/Railtie.html .

    # 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将在那些时候重新加载,可能会抹去我们的hook方法);而hook就是:它向所有控制器(或者更确切地说,所有扩展ApplicationController的控制器)允许用户在不影响不需要的控制器的情况下,将真正的“棒极了”代码引入控制器。

    acts-as-awesome-hook本身并不能传达令人敬畏的功能。这是因为并非所有控制器都需要此功能。相反,该方法负责引入 很棒的东西,通过ActsAsawome::InstanceMethods模块。这样,用户只有在显式调用acts_as_Awesome方法时才能获得令人敬畏的功能。它还向控制器添加了一个before过滤器,以证明此方法中的代码的计算结果与目标控制器类中的代码完全相同。

    如果目标是模型而不是控制器,则此技术的工作原理应该完全相同:只需将钩子插入ActiveRecord::Base。由于AR:B只在Rails启动时加载,您应该能够将其放入一个初始值设定项中(请参阅Railtie文档),但我保留在这里出错的权利。

    关于railtie的一个问题是:文档读起来好像应该自动检测到它,但是我经常遇到这个问题。要解决这个问题,只需要从gem的主源文件中获取railtie(在上面的例子中,这将是lib/acts-as-awesome.rb)。

    http://github.com/sinisterchipmunk/acts_as_awesome

    我希望这对你有帮助。你的问题有点高层次,所以我只能做出高层次的回答。

    -科林麦肯齐四世

    http://thoughtsincomputation.com

    @险恶的奇普尼克