2013-06-30 47 views
2

由於new動作通常不需要參數,因此它會從頭開始創建新的資源。 在我的應用程序中,每當我創建某種類型的資源時說一個book我需要提供一個模板,這是另一個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 

但耙路說,這是不太我想要的東西:

GET  /books/:id/new_wp/:template_id(.:format) books#new_wp 

也就是說,它有兩個參數。

回答

2

嘗試:

resource ... 
    get "new/:template_id", :to => "Books#new_wp", :on => :collection 
end 

# GET /books/new/:template_id(.:format) Books#new_wp 
+1

好吧,我已經添加了一個:as =>:new,因爲如果沒有,它不會生成路線的快捷方式。問題仍然存在,那就是:以這種方式生成的快捷方式是複數:new_books,它應該生成一個單獨的版本:-( – AgostinoX

+0

你希望它在收集,而不是成員。 –

+1

你是對的,像這樣它的作品,我只是觀察指定資源時自動執行的「新」,僅限於單數。 – AgostinoX

1

我這樣做的時候,最簡單的方法,我相信是剛剛調整path_names。這樣你的路由名稱就不會混亂。讓我解釋。

方案1 - 標準導軌

代碼

resources :books 

輸出

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 

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

輸出

  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 

方案3 - 我的優選的和由上述steakchaser

代碼

resources :books, path_names: {new: 'new/:template_id' } 

輸出

注意到

您會注意到,在場景2中,您缺少一個路徑名,這意味着您需要添加一個as: :new,這將生成new_new_book。修復此問題,您可以將get ":template_id" ...更改爲get path: ":template_id"...,這將生成new_book

如果您只想爲新的傳遞參數,則我的首選項是方案3。如果您想更改操作,那麼您應該考慮使用方案2,但不包括來自資源的:new,或者在您的情況下不要將:new添加到only:參數中。