代码之家  ›  专栏  ›  技术社区  ›  Neil Middleton

在Rails中扩展ruby gem

  •  6
  • Neil Middleton  · 技术社区  · 16 年前

    比如说,我有一个Rails应用程序,它的大部分功能都来自于gem(例如CMS)。

    如果我现在需要添加一些定制(例如,向用户添加属性),那么最好的做法是什么?如果我定制gem,那么我在将来更新gem时会遇到问题。

    在这里最好的方法是什么?

    2 回复  |  直到 16 年前
        1
  •  17
  •   James H    15 年前

    这个问题已经很老了,但我觉得它需要更多的充实。确实,您可以在运行时使用monkeypatch rails(和ruby)。这意味着很容易重新打开类或模块并注入新代码。然而,在rails中,由于在开发模式下进行的所有动态类加载和卸载,这有点棘手。

    最简单的方法是将代码放入初始值设定项(例如config/initializers/user_extensions.rb)。您可以使用class_eval注入代码。

    User.class_eval do
      ... new code ...
    end
    

    ruby可扩展性的一个主要缺点是跟踪代码的来源。您可能需要添加一些关于正在加载的扩展的日志消息,以便人们可以跟踪它。

    Rails.logger.info "\n~~~ Loading extensions to the User model from #{ __FILE__ }\n"
    User.class_eval do
      ... new code ...
    end
    

    进一步阅读:

    http://airbladesoftware.com/notes/monkey-patching-a-gem-in-rails-2-3

        2
  •  1
  •   troelskn    16 年前

    更新:

    请注意,这些自定义是特定于应用程序的

    对我的意思是以某种方式修改通用api,这样就可以定制每个应用程序。例如,允许用户将块传递给某些方法等。

    推荐文章