Ago*_*noX 5 routes ruby-on-rails
该new操作通常不需要参数,因为它从头开始创建新资源。在我的应用程序中,每当我创建某种类型的资源时,我book需要提供一个模板,即另一个资源的 id book。所以我的new路线总是有一个参数。我不知道如何将这一事实写入routes.rb文件。
因为我什至不知道它是否可行,如果不可行,那么我将创建一个 new_wp,一个“带有参数的新”操作。
我尝试将其添加到我的
resources :books, :only => [:edit, :update, :show, :new] do
member do
get 'new_wp/:template_id', :action => 'new_wp'
end
end
Run Code Online (Sandbox Code Playgroud)
但 rake 路线说这并不完全是我想要的:
GET /books/:id/new_wp/:template_id(.:format) books#new_wp
Run Code Online (Sandbox Code Playgroud)
也就是说,它有两个参数。
我经常这样做,我相信最简单的方法就是调整路径名。这样你的路线名称就不会弄乱。让我解释。
场景 1 - 标准导轨
代码
resources :books
Run Code Online (Sandbox Code Playgroud)
输出
books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
Run Code Online (Sandbox Code Playgroud)
场景 2 - 克里斯·希尔德版本
代码
resources :books do
get "new/:template_id", to: "books#new_wp", on: :collection
end
# You can also do, same result with clearer intention
# resources :books do
# get ":template_id", to: "books#new_wp", on: :new
# end
Run Code Online (Sandbox Code Playgroud)
输出
GET /books/new/:template_id(.:format) books#new_wp
books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
Run Code Online (Sandbox Code Playgroud)
场景 3 - 我的首选并由上面的 Steakchaser 指出
代码
resources :books, path_names: {new: 'new/:template_id' }
Run Code Online (Sandbox Code Playgroud)
输出
books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new/:template_id(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PATCH /books/:id(.:format) books#update
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
Run Code Online (Sandbox Code Playgroud)
您会注意到,在场景 2 中,您缺少路径名,这意味着您需要添加一个as: :new将生成new_new_book. 解决这个问题,您可以将其更改get ":template_id" ...为get path: ":template_id"...将生成new_book
如果您只想传递 new 参数,我更喜欢场景 3。如果您想更改操作,那么您需要考虑使用场景 2,但从:new资源中排除,或者在您的情况下不要添加:new到only:参数中。
尝试:
resource ...
get "new/:template_id", :to => "Books#new_wp", :on => :collection
end
# GET /books/new/:template_id(.:format) Books#new_wp
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5794 次 |
| 最近记录: |