2013-09-22 76 views
0

編輯我的Rails 4應用程序routes.rb文件,我得到意想不到的行爲(意外的形式,我的觀點)。Rails routes.rb意外的行爲

我在嘗試創建更新預訂記錄的鏈接。我在我的BookingsController中創建了一個名爲WITHDRAW的動作,可以處理更新過程。我想鏈接通過預訂ID和我的代碼鏈接是這樣的:

<%= link_to "Withdraw this booking", bookings_withdraw_path(@booking), :confirm => "Are you sure you want to withdraw this booking?", :method => :patch %> 

當我嘗試設置此鏈接的路線時,出現問題。如果我下面的行添加到我的路線文件:

match 'bookings/withdraw/:bid' => 'bookings#withdraw', via: 'patch' 

然後當我運行rake命令來查看路由就說明這一點:

bookings_withdrawn GET /bookings/withdrawn(.:format)   bookings#withdrawn 
        PATCH /bookings/withdraw/:bid(.:format)  bookings#withdraw 

正如你所看到的,WITHDRAW路徑是部分(上面提到的WITHDRAWN是不同的路徑)。如果我從路徑中刪除/:bid部分,那麼它會創建它自己的路徑,這是我所期望的。

有人可以解釋爲什麼會發生這種情況嗎?

+1

現在我無法在任何源代碼中找到它,但我很確定動態路由沒有默認命名,您必須通過將'as:'bookings_withdraw''(在這種情況下)添加到這是預期的行爲。 – zrl3dx

+0

這就是 - 謝謝。我沒有意識到這一點。非常感謝! – tommyd456

+0

如果您想將其添加爲答案,我會將其標記爲正確。 – tommyd456

回答

0

正如我寫的評論,您應該添加:as選項到您的路線,即:

match 'bookings/withdraw/:bid' => 'bookings#withdraw', via: 'patch', as: 'bookings_withdraw' 

由於動態部分:bid,命名的路由可能不是自動生成的,AFAIK Rails在這種情況下不會生成隱式命名路由,因此您必須明確添加它們,但我仍然無法在文檔中找到它,也許如果有人可以分享,我會更新我的答案。

1

嘗試了這一點

路線文件傳遞塊resources :bookings這樣

resources :bookings do 
    member do 
     patch :withdraw 
    end 
    end 

,並刪除該

match 'bookings/withdraw/:bid' => 'bookings#withdraw', via: 'patch'