2017-09-13 102 views
1

如何獲取一部分路由大寫?例如,我有一條路線scim/v2/user,但我希望它是scim/v2/User(用戶大寫)。在仍然使用resource的情況下,我該如何實現這一目標。Rails中不區分大小寫的路由

routes文件:

namespace :scim, defaults: { format: :json } do 
    namespace :v2 do 
    resource :user, only: [:create, :update, :show] 
    end 
end 

當我運行$rake routes,我得到這個:

     scim_v2_user POST    /scim/v2/user(.:format)               scim/v2/users#create {:format=>:json} 
           GET    /scim/v2/user(.:format)               scim/v2/users#show {:format=>:json} 
           PATCH    /scim/v2/user(.:format)               scim/v2/users#update {:format=>:json} 
           PUT    /scim/v2/user(.:format)               scim/v2/users#update {:format=>:json} 

我想要麼路線是/scim/v2/User或讓他們保持不變,但有映射/scim/v2/User/scim/v2/user的方式。

+0

您可能想要考慮不這樣做,並創建一個單獨的重定向。如果像Google這樣的搜索漫遊器在不同的情況下(例如,用戶在其他網站(例如博客和論壇)上放置此類網址)但找到網頁(例如200 OK),則可能會感到困惑。 –

回答

1

默認resource想要的資源名稱和控制器之間的直接映射,但是你可以簡化使用大寫資源名稱並手動指定控制器來解決這個問題:

namespace :scim, defaults: { format: :json } do 
    namespace :v2 do 
     resource :User, :controller => 'users', only: [:create, :update, :show] 
    end 
    end 

生成

 Prefix Verb URI Pattern    Controller#Action 
scim_v2_User GET /scim/v2/User(.:format) scim/v2/users#show {:format=>:json} 
      PATCH /scim/v2/User(.:format) scim/v2/users#update {:format=>:json} 
      PUT /scim/v2/User(.:format) scim/v2/users#update {:format=>:json} 
      POST /scim/v2/User(.:format) scim/v2/users#create {:format=>:json} 
+0

您的解決方案與此處列出的解決方案有什麼區別:http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/。 像你的似乎更好,不需要操縱中間件。 – Cyzanfar

+1

該解決方案涉及使用中間件來使用rails的路由進行猴子攻擊。我總是喜歡在rails中解決這個問題,而不是在另一個解決方案的頂層。如果必須同時支持'User'和'user'是一個約束(你沒有在你的問題中指定),你一定可以這樣做。我建議使用類似[rails downcaser](https://github.com/substancelab/route_downcaser)的更類似的東西,但是 –

+0

這仍然區分大小寫,只是選擇不同(例如'/ scim/v1/User ''而不是'/ scim/v1/user'),但是現在'/ scim/v1/user'不能工作,也不會說'/ scim/V1/User'等等。鏈接的中間件將整個請求路徑以小寫(所以再次不完全不區分大小寫,但更接近)。 –

0

我能夠通過手動指定pathcontroller來解決此問題。我指定path應該是用戶(大寫)。以下是我的路線文件中的代碼:

namespace :scim, defaults: { format: :json } do 
    namespace :v2 do 
     resources :user, 
     path: "Users", 
     controller: "users", 
     only: [:create, :update, :index, :show] 
    end 
    end