为什么在Rails中没有自定义路由的路径名

Akh*_*hil 14 routes ruby-on-rails custom-routes ruby-on-rails-3

在我的rails应用程序中跟随routes.rb

resources :users
Run Code Online (Sandbox Code Playgroud)

导致'rake routes'的输出结果

 users        GET    /users(.:format)                 users#index
              POST   /users(.:format)                 users#create
 new_user     GET    /users/new(.:format)             users#new
 edit_user    GET    /users/:id/edit(.:format)        users#edit
 user         GET    /users/:id(.:format)             users#show
              PUT    /users/:id(.:format)             users#update
              DELETE /users/:id(.:format)             users#destroy
Run Code Online (Sandbox Code Playgroud)

&follow在routes.rb中(对于我的自定义控制器'home')

match  '/new_user'        =>          'home#new_user', via: [:get]
match  '/users/:id/edit'  =>          'home#edit_user', via: [:get]
match  '/users/:id'       =>          'home#show_user', via: [:get]
match  '/users/:id'       =>          'home#create_user', via: [:post]
Run Code Online (Sandbox Code Playgroud)

导致'rake routes'的输出结果

GET    /new_user(.:format)                home#new_user
GET    /users/:id/edit(.:format)          home#edit_user
GET    /users/:id(.:format)               home#show_user
POST   /users/:id(.:format)               home#create_user
Run Code Online (Sandbox Code Playgroud)

为什么第二种情况没有路径名?比如第一种情况('new_user','edit_user')

有没有办法让第二种情况的路径名?因为我想在我的视图中使用这些路径名称

mea*_*gar 37

没有路径名,因为您没有指定路径名.如果您要提供自定义路由而不是使用resources,则需要使用:as提供路径名:

match '/new_user' => 'home#new_user', via: :get, as: :new_user
Run Code Online (Sandbox Code Playgroud)

您还应该使用get而不是match... via: :get:

get '/new_user' => 'home#new_user', as: :new_user
Run Code Online (Sandbox Code Playgroud)

但是,根据您的路线集,您最好的选择是继续使用resources,但通过以下方式提供有限的操作列表:only和自定义控制器:controller:

resources :users, only: %w(new edit show create), controller: "home"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢..这很快,+ 1 + :),还有一个问题是有什么优势可以放弃'匹配......来自:: get'?如上所述 (2认同)
  • 我的方式更短更清晰.更好的问题是:使用`match ... via :: get` over`get`有什么好处吗? (2认同)