gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:01:22 28 4
gpt4 key购买 nike

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

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

是否有一个很好的教程来讨论 rails3 gems?我发现了几个讨论 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_* 问题或 Controller )

  • 谢谢

    最佳答案

    更新:我添加了基于此答案的博客文章,但更详细: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,我会从那里开始。我的 railtie 可能看起来像:

    # 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 block (我们希望这样做,因为 ApplicationController 将在这些时候重新加载,可能会清除我们的钩子(Hook)方法);钩子(Hook)就是这样:它为所有 Controller (或者更确切地说,所有扩展 ApplicationController 的 Controller )添加了一个钩子(Hook),以允许用户将真正的“真棒”代码引入他们的 Controller ,而不会影响不需要它的 Controller 。

    #acts_as_awesome 钩子(Hook)本身并不传达 Awesome 功能。那是因为并非所有 Controller 都可能需要此功能。相反,该方法负责通过 ActsAsAwesome::InstanceMethods 模块引入真正令人敬畏的东西。这样,用户只有在显式调用acts_as_awesome 方法时才能获得Awesome 功能。它还向 Controller 添加了一个前置过滤器,以证明此方法中的代码将被评估与目标 Controller 类本身中的代码完全相同。

    如果您的目标是模型而不是 Controller ,这种技术应该完全相同:只需将您的钩子(Hook)注入(inject) ActiveRecord::Base。由于 AR:B 仅在 Rails 启动时加载,您应该可以将其放入初始化程序(请参阅 Railtie 文档),但我保留在此犯错的权利。

    关于 railtie 的一个问题:文档看起来好像应该被自动检测到,但我经常遇到这个问题。要绕过它,只需从 gem 的主源文件中获取 railtie(在上面的示例中,这将是 lib/acts_as_awesome.rb)。

    您可以在我的 github 帐户中看到完整的 ActsAsAwesome 源代码:
    http://github.com/sinisterchipmunk/acts_as_awesome

    我希望这是有帮助的。你的问题有点高级,所以我能做的最好的回答是高级别的。

    ——科林·麦肯齐四世

    http://thoughtsincomputation.com

    @sinisterchipmnk

    关于ruby-on-rails-3 - rails3 gem : acts_as_something,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018469/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com