【问题标题】:Reopen Impression Class from Impressionist Gem in Rails 4从 Rails 4 中的 Impressionist Gem 重新打开 Impression 类
【发布时间】:2013-10-11 05:44:14
【问题描述】:

我正在尝试修改印象派宝石类“印象”无济于事。

我尝试了以下方法:

class Impression
  def hello
    "world"
  end
end

Impression.class_eval do
end

两者都在: /app/models/impression.rb 和 /lib/impression.rb(正确配置以包含此文件夹)

我做错了什么?我正在使用 Rails 4。理想情况下,我想添加一个活动记录关联并添加一些辅助方法。

【问题讨论】:

  • 您收到的错误消息或失败是什么?你能否展示一下你是如何尝试使用这些修改的?无论如何,第一次尝试都是有效的 Ruby,第二次是有效的,前提是 Impression 已预先定义。但是,Impression 类可能没有发挥您认为它在 Rails 应用程序中的作用。
  • 这只是一个标准的错误信息,说你好不存在...

标签: ruby-on-rails ruby ruby-on-rails-4 monkeypatching


【解决方案1】:

如果您要覆盖 gem 提供的类,则需要手动要求您的版本以包含您的更改。这通常在初始化程序中完成。

【讨论】:

  • 您介意提供一个例子或澄清一下吗?我是否可以在 lib/impression.rb 中定义类,然后在 confing/initializers/impression.rb 中需要“lib/impression.rb”
  • @ckarbass 您可以在加载路径中的任何位置定义类(我会使用app/models,因为它在gem 中),然后在初始化程序中需要它(例如require 'impression') .
  • 我尝试了类似的事情,因为我想覆盖 Impression 类。我正在使用 Rails 3,这个解决方案对我不起作用。您是否进行了其他配置?
  • @sevenseacat 你能举个例子说明它是如何做到的。我最近问了一个问题here 将印象派模型与 solr 联系起来。
【解决方案2】:

我假设您正在谈论这个宝石:https://github.com/charlotte-ruby/impressionist 并想更改模型类Impression

据我所知,它应该是一个 Rails 引擎。

rails 引擎曾经被命名空间,堆栈跟踪可能已经揭示了这一点。

你试过了吗?

# app/extensions/impressionist/impression.rb
module Impressionist
  class Impression
    def hello
      "world"
    end
  end
end

您也可以尝试将代码放入初始化程序中,因为这也可能是加载顺序问题。

【讨论】:

  • 出于调试目的,打开 gem,将其放在文件 puts caller 的顶部或引发异常。这样你就可以看到类是否以及何时加载。
【解决方案3】:

试试这个:

require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression')

class Impression
  def hello
    "world"
  end
end

【讨论】:

  • 好吧,定义了几个类,请检查更新的答案
  • impression.rb(我的扩展名)在哪里重要吗?我会再试一次。
【解决方案4】:

应该使用concern 来使用您自己的方法扩展模型类。尝试将其放入您的 lib 文件夹中的文件中,并在初始化程序中要求它:

require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression')

module ImpressionExtensions
  extend ActiveSupport::Concern

  def some_instance_method
    # do some stuff
  end

  module ClassMethods
    def some_class_method
      # do some stuff
    end
  end

end

Impression.send(:include, ImpressionExtensions)

向任何模型添加方法都应该以类似的方式完成。 Impressionist 的工作方式有点不同,它首先将 Impression 类定义为一个常规的独立类,然后将其覆盖并使其成为模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多