Dodawanie metod do modelu z poziomu engine

Hej!
Staram się stworzyć do własnych potrzeb appkę, którą można rozszerzać za pomocą engine’ów. Na takie coś składa się oczywiście wiele spraw - widoki, modele, kontrolery, dekoratory i tak dalej ale chciał bym się na początek skupić na, chyba, najprostszej z nich - modelach.

Powiedzmy, że chciał bym dodać do modelu Post (klik) nową metodę new_method(). Z niezliczonych artykułów, które przeczytałem wynika, że muszę użyć .class_eval. O ile działa mi to doskonale jeśli użyje tego w pliku z oryginalnym modelem, to niestety nie chce zadziałać z poziomu engina.

Czyli - jeśli dopiszę do pliku post.rb (oryginalny model) taki kod:

Post.class_eval do
  def new_method(); end
end

to wszystko działa elegancko. Jeśli jednak stworzę sobie plik w enginie, to niestety już nie jest tak łatwo: https://github.com/mbajur/eval_test/blob/master/example_engine/app/models/post.rb

Czy ktoś był by na tyle dobry, aby wytłumaczyć mi jak totalnie początkującemu czemu mi to nie działa i co mogę zrobić, aby zadziałało tak jak bym tego chciał? :wink: Podkreślam, że zależy mi na tym, aby “załączanie” engineów odbywało się jedynie za pomocą Gemfile. Bez żadnych dodatkowych require’ów ze strony aplikacji głównej.

Z góry dzięki!

ps. tutaj repo przykładowej appki, instrukcja obsługi w readme: https://github.com/mbajur/eval_test

Nie trzeba używać class_eval, wystarczy otworzyć ponownie klasę Post

class Post
  def new_method
  end
end
```

Kod znajdujący się w silnik/app/models/post.rb nie jest automatycznie wczytywany przy dodaniu silnika. Przenieś ten kod do initializera, albo ręcznie wykonaj gdzieś w aplikacji (`require Engine.root.join('app/models/post.rb')`).

Niestety moja sytuacja jest nieco bardziej zawiła (muszę mieć możliwość używania wielu engine’w jednocześnie, bez ograniczeń) i udało mi się osiągnąć zamierzony efekt przy pomocy nastpujących zmian: https://github.com/mbajur/eval_test/commit/e9c10738b05b150a766cbf94e0d6905562d42c99?diff=unified#diff-0

Swoją drogą - nie wiedziałem, że ten napisany przeze mnie wcześniej kod nie zostanie automatycznie załadowany, stąd całe zamieszanie. A wszystko było pięknie opisane w dokumentacji :wink: http://guides.rubyonrails.org/engines.html#overriding-models-and-controllers

Dzięki!