Rails Gem with model-relationships for Rails Engin

2019-06-08 10:42发布

问题:

I'm just developing a Rails application which will have many Engines. However, I'm not able to edit relationships inside the Engines.

To solve this issue, I want to create a relationships-Gem which will be included in the Application and defines the relationships (see: https://stackoverflow.com/a/11835899/603126).

Let's assume, I have a User (namespaced and isolated) Engine and a Comment (namespaced and isolated) Engine. What I want is to override / extend the relationships inside the relationships-Gem which will share the relationships.

So I added a file /app/models/comment.rb with these lines (to the relationships-Gem):

class Comment < CommentEngine::Comment
  belongs_to :user
end

class User < UserEngine::User
  has_many :comments
end

If I run my rails application, the relationships won't be established.

What am I missing? How can this be achieved?

Thank you very much in advance

回答1:

Ok, so I've found a solution for that.

You can just monkey-patch your Engine with Decorators (you need to put it into config/initializers/initializer_name.rb)

see: Extending a ruby gem in Rails

Don't know if this is a good thing, but it works like a charm...

The downside is that you have to restart the server every single time you make a change to the monkey-patching...

EDIT: It seems that this monkey-patch will be garbage collected after a few requests.

EDIT 2: This post helped me out How to monkey-patch code that gets auto-loaded in Rails? you need to add thin sin your Intializer to force rails to reload your patch for every request

Rails.configuration.to_prepare do


回答2:

The activesupport-decorators gem can load your decorators for you when the original class is loaded.