routing-filter icon indicating copy to clipboard operation
routing-filter copied to clipboard

make compatible with rails 7.1 (most likely will break for previous v…

Open nduitz opened this issue 1 year ago • 14 comments

This seems to work fine in our project for filters to work again with rails >= 7.1.

Maybe I'll have the time to properly implement this with backwards compatibility.

For now this might help others :)

Should address this issue https://github.com/svenfuchs/routing-filter/issues/83

nduitz avatar Mar 05 '24 21:03 nduitz

I confirm this fixes the issue. @svenfuchs can you please merge and release this as a new major version? I think it's fine to drop support for pre-Rails 7.1 as users can just use older versions of this gem which is very stable.

johnnyshields avatar May 28 '24 09:05 johnnyshields

@simi can you handle this?

johnnyshields avatar May 29 '24 04:05 johnnyshields

Can also confirm this helps. As the project support seams to be dead at this point, I recommend using a monkey patch in the meantime by adding a file lib/ext/routing_filter/adapters/routers/journey.rb

if Gem.loaded_specs['routing-filter'].version > Gem::Version.new('0.7')
  raise 'Check if PR https://github.com/svenfuchs/routing-filter/pull/87 has been merged and released. If yes, delete this monkey patch.'
end

# We cannot prepend a custom extension module here because we call `super` in this method which should call the Rails
# #find_routes-method and not the routing_filter's #find_routes-method which is broken.
# Instead, we override the whole module definition to fix it.
module ActionDispatchJourneyRouterWithFiltering
  def find_routes(env)
    path = env.is_a?(Hash) ? env['PATH_INFO'] : env.path_info
    filter_parameters = {}
    original_path = path.dup

    @routes.filters.run(:around_recognize, path, env) do
      filter_parameters
    end

    super(env) do |match, parameters, route|
      parameters = parameters.merge(filter_parameters)

      if env.is_a?(Hash)
        env['PATH_INFO'] = original_path
      else
        env.path_info = original_path
      end

      yield [match, parameters, route]
    end
  end
end

This opens the module and overwrites the libary's current implementation within your application. Then add an initializer config/initializers/ext.rb and require the directory contents:

Dir.glob(Rails.root.join('lib/ext/**/*.rb')).sort.each do |filename|
 require filename
end

See also: https://makandracards.com/makandra/40730-how-to-organize-monkey-patches-in-ruby-on-rails-projects

You cannot use prepend for monkey patching the module as it calls super itself and we need to exchange the complete implementation.

begerdom avatar Jun 14 '24 12:06 begerdom

Thanks for this fix @nduitz ! It works for me on Rails 7.1.4 - I really hope somebody is able to merge and release this and that the gem has not just become abandonware.

jimbali avatar Aug 23 '24 17:08 jimbali

@simi @svenfuchs please merge this and release as a new major version?

johnnyshields avatar Sep 05 '24 22:09 johnnyshields