2013-10-11 3 views
4

Я пытаюсь изменить класс импрессионизма «Впечатление» безрезультатно.Reupen Impression Class от Impressionist Gem in Rails 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, а затем потребовал «lib/impression.rb» в confing/initializers/impression.rb – ckarbass

+0

@ckarbass. Вы можете определить класс в любом месте пути загрузки (я бы использовал 'app/моделей, потому что именно там, где он находится в драгоценном камне), а затем требуют его в инициализаторе (например, 'require 'impression''). – sevenseacat

+1

Я пробовал аналогичную вещь, так как я хочу переопределить класс Impression. Я использую Rails 3, и это решение не сработало для меня. Вы делали какие-либо дополнительные конфигурации? – KavitaC

1

Я предполагаю, что вы говорите об этом камне: https://github.com/charlotte-ruby/impressionist и хотите изменить класс модели Impression.

Из того, что я вижу, предполагается, что это рельсовый двигатель.

Рельсовые двигатели используют пространство имен, трассировка стека могла бы выявить это.

Вы попробовали?

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

Вы также можете попробовать ввести код в инициализатор, так как это может быть проблема с загрузкой.

+0

Спасибо, но не сработал. – ckarbass

+0

для отладки, откройте драгоценный камень, поместите это поверх файла '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) 

Добавление методов к любой модели должно быть сделано таким же образом. То, как работает Импрессионист, немного отличается, поскольку он сначала определяет класс Impression как обычный, автономный класс, прежде чем переопределять его и сделать его образцом.

 Смежные вопросы

  • Нет связанных вопросов^_^