2015-09-19 5 views
0

Я закончил создание игрушечного приложения, чтобы лучше изучить Rails, но я не удовлетворен своей текущей реализацией маршрутов. Я хотел бы DRY их, но я не уверен, как это сделать, поскольку документы 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] 

Это создаст все нормальные маршруты, кроме тех index и new маршрутов. Для Avatar маршрутов, вы можете попробовать это:

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

Попробуйте прочитать this guide для получения дополнительной информации маршрутизации Rails.

+1

блин ... Я собирался предлагать использовать «ресурсы», но ты тоже меня избил. – Chris

+0

Не совсем. Вы дали решение REST, пока мои маршруты RESTless, поэтому ваше предложение вводит в заблуждение. По-видимому, правильным подходом в этом случае является использование маршрутов с ограниченным доступом. См. Мой ответ ниже, как я это сделал. – Duos

Смежные вопросы