我正在编写rails应用程序,我需要更改应用程序的一些URL pathes。但我不想破坏我的测试并在视图,js或控制器中进行更改......
这是我的路线:
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
的方法。
现在我需要更改这个pathes列表:
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
?
请帮我修理一下。 谢谢!
答案 0 :(得分:3)
您可以指定用于资源的控制器,而不是使用path
hack:
resources :news, controller: 'posts' do
end
当谈到你们其他人的问题时,也许你应该学习这些方法以及RESTful默认值的原因。
使用/news/all
非常特殊 - 在REST中,如果路径描述的资源不是" root"应该显示所有项目。
get 'edit/page/: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
是的,这会打破你的考验 - 哇哇哇哇但是,为避免更改现有代码/测试而构建错误的应用程序并不是一种可行的长期方法。