2015-09-19 37 views
0

我已經完成了構建玩具應用程序以更好地學習Rails,但我對目前的路由實現不滿意。我想幹掉它們,但是我不知道如何去做,因爲Rails文檔只包含帶有資源的REST路由。這裏是我的routes.rb我該如何重構我的RESTless路線?

root 'index#home' 

    # Avatars 
    get '/:user/change_avatar' => 'avatars#edit', as: :change_avatar 
    post '/:user/change_avatar' => 'avatars#update', as: :update_avatar 

    # Users 
    get '/:user' => 'users#show', as: :show_user 
    get '/:user/edit' => 'users#edit', as: :edit_user 
    delete '/:user' => 'users#destroy', as: :destroy_user 

    # Playlists 
    post '/:user/playlists' => 'playlists#create', as: :playlists 
    get '/:user/:playlist' => 'playlists#show', as: :show_playlist 
    get '/:user/:playlist/edit' => 'playlists#edit', as: :edit_playlist 
    patch '/:user/:playlist' => 'playlists#update', as: :update_playlist 
    delete '/:user/:playlist' => 'playlists#destroy', as: :destroy_playlist 

    # Tracks 
    post '/:user/:playlist/tracks' => 'tracks#create', as: :tracks 
    get '/:user/:playlist/:track' => 'tracks#show', as: :show_track 
    get '/:user/:playlist/:track/edit' => 'tracks#edit', as: :edit_track 
    patch '/:user/:playlist/:track' => 'tracks#update', as: :update_track 
    delete '/:user/:playlist/:track' => 'tracks#destroy', as: :destroy_track 

    # Photos 
    delete '/:user/:playlist/:track/photos/:id' => 'photos#destroy', as: :destroy_photo 

如可以注意到,在:user:playlist,並:track動態段出現在幾乎所有的航線。我該如何改進?

+0

使用範圍可以幫助 – Kiloreux

+1

看看HTTPS://www.airpair。 com/ruby​​-on-rails/posts/building-a-restful-api-in-a-rails-application – Kiloreux

+0

感謝您的提示。很有幫助。你可以看看我的答案,看看我最終結束了什麼。 – Duos

回答

0

由於Kiloreux的建議,使用範圍,這裏是我結束了 - 正是我一直在尋找:

root 'index#home' 

    scope '/:user' do 
    get '/change_avatar' => 'avatars#edit', as: :change_avatar 
    post '/change_avatar' => 'avatars#update', as: :update_avatar 
    get '/edit' => 'users#edit', as: :edit_user 
    delete '/' => 'users#destroy', as: :destroy_user 
    post '/playlists' => 'playlists#create', as: :playlists 
    end 

    scope '/:user/:playlist' do 
    get '/' => 'playlists#show', as: :show_playlist 
    get '/edit' => 'playlists#edit', as: :edit_playlist 
    patch '/' => 'playlists#update', as: :update_playlist 
    delete '/' => 'playlists#destroy', as: :destroy_playlist 
    post '/tracks' => 'tracks#create', as: :tracks 
    end 

    scope '/:user/:playlist/:track' do 
    get '/' => 'tracks#show', as: :show_track 
    get '/edit' => 'tracks#edit', as: :edit_track 
    patch '/' => 'tracks#update', as: :update_track 
    delete '/' => 'tracks#destroy', as: :destroy_track 
    delete '/photos/:id' => 'photos#destroy', as: :destroy_photo 
    end 
1

對於Playlist路線,你可以做這樣的事情:

resources :playlists, except: [:index, :new] 

,將創建除indexnew線路一切正常路線。對於Avatar路線,你可以試試這個:

resources :avatars, only: [] do 
    get :edit, on: :member, as: :change_avatar 
    post :update, on: :member, as: :update_avatar 
end 

嘗試閱讀this guide更多on Rails的路由。

+1

該死的......我打算建議使用「資源」,但你也打敗了我。 – Chris

+0

不完全。你已經給出了一個REST解決方案,而我的路由是RESTless,所以你的建議是誤導性的。顯然,在這種情況下正確的做法是採用有限範圍的路線。請參閱下面的答案,瞭解我是如何做到的。 – Duos