2016-03-18 4 views
0

Я пишу приложение rails и мне нужно изменить некоторые URL-адреса моего приложения. Но я не хочу сломал мои тесты и внести изменения в поле зрения, JS или контроллеры ...Как правильно использовать: path_names в маршрутах rails?

Вот мои маршруты:

resources :posts, path: 'news' do 
    member do 
     get 'edit/page/:page', as: :edit, action: :edit 
     post '/approve',  as: :approve, action: :approve 
     post '/reject',   as: :reject, action: :reject 
    end 

    collection do 
     get :my 
     get :shared_with_me 
     get :filtered 
    end 
    end 

Как вы видите, я нашел способ изменить domain.com/posts к domain.com/news на всех веб-сайтах.

Теперь мне нужно сделать, изменить этот список трактов:

  • от domain.com/news к domain.com/news/all (получить posts#index)
  • от domain.com/news/12 до domain.com/news/preview/12 (получить posts#show)
  • от domain.com/news/new к domain.com/news/request (получить posts#new)

Я пытаюсь изменить это трактов с помощью :path_names, но это не работает ...

Здесь обновляется маршруты:

resources :posts, path: 'news', path_names: {index: 'all', show: 'preview', new: 'request'} do 
    member do 
     get 'edit/page/:page', as: :edit, action: :edit 
     post '/approve',  as: :approve, action: :approve 
     post '/reject',   as: :reject, action: :reject 
    end 

    collection do 
     get :my 
     get :shared_with_me 
     get :filtered 
    end 
    end 

Когда я сделал это изменения и запускает rake routes - только GET news/request появляется. .

Но почему я не вижу GET news/all и GET news/:id/review?

Пожалуйста, помогите мне исправить. Спасибо!

ответ

2

Вы можете указать контроллер для использования ресурса вместо использования path хака:

resources :news, controller: 'posts' do 

end 

Когда дело доходит до остальные из вас вопроса, может быть, вы должны изучить хау и почему о RESTful по умолчанию вместо ,

Использование /news/all довольно своеобразно - в REST подразумевается, если путь описывает ресурс, чем «root» должен отображать все элементы.

get 'edit/page/:page' 

Это просто странно. Если страница является вложенной ресурс news вы бы объявить его следующим образом:

resources :news, controller: 'posts' do 
    resources :pages 
    # or 
    resource :page 
end 

Вы также не должны использовать глагол POST утвердить/отклонить историю. POST подразумевает, что вы создаете ресурс. Вместо этого вы можете сделать что-то вроде:

resources :news, controller: 'posts' do 
    member do 
    patch :approve 
    patch :reject 
    end 
end 

Да, это нарушит ваши испытания - waah waah. Однако создание плохих приложений только для того, чтобы избежать изменения существующего кода/тестов, не является жизнеспособным долгосрочным подходом.

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