Hey @kaspth, thanks for creating this awesome gem!
I've encountered a weird issue on the latest 0.3.0 version. I have a minimal reproduction repo here: https://github.com/marcoroth/conventional_extensions-repro
I guess the main questions is: Am I even supposed to use load_exentions
inside a model class under app/models/
?
Versions
- conventional_extensions: 0.3.0
- Ruby: 3.1.2
- Rails: 7.0.4
Relevant Files
Reproducion Steps
rails db:create db:migrate
Loading development environment (Rails 7.0.4)
irb(main):001:0> Post.new.mailroom
/Users/marcoroth/.anyenv/envs/rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/conventional_extensions-0.3.0/lib/conventional_extensions.rb:15:in `load_extensions': private method `load' called for nil:NilClass (NoMethodError)
@loader.load(*extensions)
^^^^^
Possible fix?
This seems to fix it locally, but honestly I haven't fully grokked why @loader
wouldn't need to be defined in some cases. This "fix" possibly also has some unwanted side-effects since @loader
is not going to be cleaned up in the ensure
block because of the loader_defined_before_entrance
condition.
def load_extensions(*extensions, from: Frame.previous.path)
- @loader = Loader.new(self, from) unless loader_defined_before_entrance = defined?(@loader)
+ loader_defined_before_entrance = defined?(@loader)
+ @loader = Loader.new(self, from) unless loader_defined_before_entrance
+ @loader = Loader.new(self, from) if @loader.nil
@loader.load(*extensions)
ensure
@loader = nil unless loader_defined_before_entrance
end
I assume the defined?(...)
is not doing the right thing, it returns a truthy value even if @loader
is nil
and thus not instantiating a loader.
irb(main):005:0> @loader = nil
=> nil
irb(main):006:0> defined?(@loader)
=> "instance-variable"
Either way, I'm happy to open a pull request if this fix makes sense.