如何正确使用:rails路由中的path_names?

时间:2016-03-18 08:50:17

标签: ruby-on-rails ruby-on-rails-4 routes rails-routing

我正在编写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/postsdomain.com/news的方法。

现在我需要更改这个pathes列表:

  • domain.com/newsdomain.com/news/all(获取posts#index
  • domain.com/news/12domain.com/news/preview/12(获取posts#show
  • domain.com/news/newdomain.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/allGET news/:id/review

请帮我修理一下。 谢谢!

1 个答案:

答案 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

是的,这会打破你的考验 - 哇哇哇哇但是,为避免更改现有代码/测试而构建错误的应用程序并不是一种可行的长期方法。