Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

nduitz
Copy link

@nduitz nduitz commented Mar 5, 2024

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
#83

@johnnyshields
Copy link

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 johnnyshields mentioned this pull request May 28, 2024
@johnnyshields
Copy link

@simi can you handle this?

@begerdom
Copy link

begerdom commented Jun 14, 2024

Can also confirm this helps.
As the project support seems 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.

@jimbali
Copy link

jimbali commented Aug 23, 2024

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.

@johnnyshields
Copy link

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

@yuvaraj-jayavel
Copy link

In case anyone is unable to change their project structure as @begerdom suggests in #87 (comment), you may use the below snippet to override. Just put it in a file under config/initializers (e.g. config/initializers/routing_filter_overrides.rb)

# Removing the (existing) broken find_routes override from the routing-filter gem first
ActionDispatchJourneyRouterWithFiltering.remove_method(:find_routes)

module CustomOverridesActionDispatchJourneyRouterWithFiltering
  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

    ##### OVERRIDE STARTS #####
    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
    ##### OVERRIDE ENDS #####
  end
end

ActionDispatch::Journey::Router.send(:prepend, CustomOverridesActionDispatchJourneyRouterWithFiltering)

@simi
Copy link
Collaborator

simi commented Nov 27, 2024

I think it is good time to sunset this gem actually. I can try to release one of the last versions, but if I understand it properly, same can be achieved with vanilla Rails simply today. Maybe worth to write some migration guide. Is there any public project I can check and migrate and link to it in README?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants