I'm using dry-views in multiple Rails engines and I have to duplicate the configuration in every subclass.
class BaseView < Dry::View::Controller
configure do |c|
c.paths = [File.join(__dir__, 'templates')]
end
end
class SubView < BaseView
configure do |c|
c.paths = [File.join(__dir__, 'templates')] # todo: remove me
end
end
The reason is, that my views can be deeply nested in a sub folder of app
ie.:
app/
app/foo/index.rb
app/foo/templates/index.html.erb
app/foo/bar/show.rb
app/foo/bar/templates/show.html.erb
Additionally the BaseView
class does not live in the same gem in most of the cases.
If I delete the configure
block from the SubView
class, the template is not found anymore. The __dir__
variable contains the directory path of the BaseView
class.
I've tried to implement a after initialization method in the base class that has access to the directory of the subclass. But at that point the configuration is not possible anymore due to restrictions in dry-rb
configuration. The configuration must happen before initialization.
The only solution I could come up with is to duplicate the configure
block in each class, or have a gem/engine specific parent class that configures all possible template paths.
The usual approach of looking for the directory of a certain method that is implemented in each subclass does also not work in this case, since most views don't even define methods.
Is there better ways to access the directory of a given class during the load phase of this class in a method of the parent class?
Callback
Class#inherited
.