ElMassimo / js_from_routes

🛣️ Generate path helpers and API methods from your Rails routes
https://js-from-routes.netlify.app/
MIT License
100 stars 7 forks source link

Incorrect method generated for routes with same URL #48

Open Shaglock opened 3 days ago

Shaglock commented 3 days ago

Description 📖

I am using devise and omniauth gems (versions 4.9.4 and 2.1.2) in brand new rails app, I have 3 providers - google, twitter and facebook. The generated paths have incorrect methods get|post

config/routes.rb

defaults export: true do
  # All routes defined inside this block will be exported.
  devise_for :users, controllers: {
    omniauth_callbacks: "users/omniauth_callbacks"
  }
end

Output of related rails routes

   user_google_oauth2_omniauth_authorize GET|POST /users/auth/google_oauth2(.:format)                users/omniauth_callbacks#passthru
    user_google_oauth2_omniauth_callback GET|POST /users/auth/google_oauth2/callback(.:format)       users/omniauth_callbacks#google_oauth2
         user_twitter_omniauth_authorize GET|POST /users/auth/twitter(.:format)                      users/omniauth_callbacks#passthru
          user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format)             users/omniauth_callbacks#twitter
        user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format)                     users/omniauth_callbacks#passthru
         user_facebook_omniauth_callback GET|POST /users/auth/facebook/callback(.:format)            users/omniauth_callbacks#facebook

Generated result

export default {
  passthru: /* #__PURE__ */ definePathHelper("get|post", "/users/auth/google_oauth2"),
  googleOauth2: /* #__PURE__ */ definePathHelper("get|post", "/users/auth/google_oauth2/callback"),
  twitter: /* #__PURE__ */ definePathHelper("get|post", "/users/auth/twitter/callback"),
  facebook: /* #__PURE__ */ definePathHelper("get|post", "/users/auth/facebook/callback"),
};

Probably its not related to devise but to the way routes are defined and how this gem handles it. Related code from devise gem https://github.com/heartcombo/devise/blob/72884642f5700439cc96ac560ee19a44af5a2d45/lib/devise/rails/routes.rb#L446C9-L457C1

Basically if the different HTTP methods are mapped to the same controller action this issue will appear. For example,

match "/test", to: "home#test", via: [ :get, :post, :patch, :put, :delete ]

results in

test: /* #__PURE__ */ definePathHelper("get|post|patch|put|delete", "/test"),

So my question is, is there anything we can do with it? Maybe the gem could use the as option that was added to the route and add method as suffix? So the result would be something like google_oauth2_omniauth_authorize_get, google_oauth2_omniauth_authorize_post, or in case of test that would be testGet, testPost, testPatch etc...

Or maybe there is some option for different exporting for such routes that I missed?

In any case, thanks for the useful gem!

Shaglock commented 3 days ago

I just realized there was already similar issue in github "Discussions" https://github.com/ElMassimo/js_from_routes/discussions/37, I was searching only issues :( Sorry

Also probably related to https://github.com/ElMassimo/js_from_routes/issues/42