2013-10-11 36 views
4

我试图修改印象派宝石类“印象”无济于事。从印象派宝石中重新打开印象类4

我已经试过如下:

class Impression 
    def hello 
    "world" 
    end 
end 

Impression.class_eval do 
end 

无论是在: /app/models/impression.rb 和 /lib/impression.rb(用正确的配置,包括这个文件夹)

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

+0

你得到的错误信息或失败是什么?你能否展示你如何尝试使用这些修改?第一次尝试是有效的Ruby,无论如何,第二次是有效的,因为预先定义了“Impression”。然而,'Impression'类可能不会扮演你认为在你的Rails应用中所扮演的角色。 –

+0

这只是一个标准的错误消息,说你好不存在... – ckarbass

回答

1

如果你覆盖了由创业板提供了一个类,你需要手动要求您版本,以获得包括更改。这通常在初始化器中完成。

+0

你介意提供一个例子还是澄清?我只是在lib/impression.rb中定义类,然后在confing/initializers/impression.rb中需要'lib/impression.rb' – ckarbass

+0

@ckarbass您可以在加载路径中的任意位置定义类(我将使用'app /模型“,因为那是它在宝石中的位置),然后在初始化器中需要它(例如'require'impression')。 – sevenseacat

+1

我尝试过类似的事情,因为我想重写Impression类。我正在使用Rails 3,而且这个解决方案对我来说不起作用。你有没有做任何额外的配置? – KavitaC

1

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

从我能看到它应该是一个轨道引擎。

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

你尝试过吗?

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

你也可以尝试把你的代码中的初始化,因为它也可能是一个加载顺序问题。

+0

谢谢,但没有奏效。 – ckarbass

+0

为了调试的目的,打开gem,把它放在'puts caller'文件的顶部或引发一个异常。这样你可以看到是否以及何时加载类。 – phoet

1

试试这个:

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

class Impression 
    def hello 
    "world" 
    end 
end 
+0

谢谢,但没有奏效。 – ckarbass

+0

确定其混淆有几个类的定义,请检查更新的答案 – apneadiving

+0

是否有关系在哪里impression.rb(我的扩展名)是?我会再试一次。 – ckarbass

1

使用自己的方法扩展模型类应该使用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类定义为常规独立类,然后覆盖它并使其成为模型。