How to override Spree Rails engine routes?
First post of my Today I Learned [TIL] serie.
Overriding a rails engine routes can be hard to achieve when you want to remove or change existing routes.
The fastest way to achieve this, is to fork the Rails engine’s repository, Spree 3.1.x e-commerce in my case, and make changes on its config/routes.rb
file.
It’s easy, it works but… it will be a pain to stay synced with the official project’s repository.
So we have to find a better way and finally the solution is pretty simple :
# config/application.rb
module MyRailsApp
class Application < Rails::Application
# Override Spree Core routes in order to translate products routes
initializer "delete_spree_core_routes", after: "add_routing_paths" do |app|
new_spree_core_route_path = File.expand_path('../../config/spree_core_routes_override.rb', __FILE__)
routes_paths = app.routes_reloader.paths
spree_core_route_path = routes_paths.select{ |path| path.include?("spree_core") }.first
if spree_core_route_path.present?
spree_core_route_path_index = routes_paths.index(spree_core_route_path)
routes_paths.delete_at(spree_core_route_path_index)
routes_paths.insert(spree_core_route_path_index, new_spree_core_route_path)
end
end
[...]
end
end
By defining this initializer
in your config/application.rb
file, you will be able to interact with the load process of the rails engines routes in your app and using your custom routes file (spree_core_routes_override.rb
) instead of the original spree_core
routes file.
Let me know if this solution helped you or if you know a better solution!
who love Ruby, Ruby on Rails and Reactive technologies.
I create web applications that help companies to propel their business model.