2014-12-06 173 views
0

我有一個嵌套的資源像這樣:軌渲染嵌套的路線行動

resources :contacts do 
    resource :leads 
end 

當我渲染編輯視圖,該網址看起來像這樣:

http://localhost:3000/contacts/1/leads/1 

當我提交表單並且它去引線控制器更新動作:

def update 
    if @lead.update_attributes(lead_params) 
     redirect_to contact_lead_path(@lead.contact, @lead) 
    else 
     render :edit 
    end 
    end 

當別人被觸發時,它呈現在網頁像這樣:

http://localhost:3000/leads/1 

當它應該是:

http://localhost:3000/contacts/1/leads/1/edit 

爲什麼沒有 「渲染編輯」 佔了整個內嵌的網址是什麼?我該如何解決這個問題?

+0

然後嘗試使用redirect_to edit_contact_lead_path(@ lead.contact,@lead) – rjackson 2014-12-06 01:57:21

+0

@rjackson是的我已經意識到這可以通過redirect_to來實現。但我不想重定向。我只想渲染。我會被迫在這裏做重定向嗎? – Donato 2014-12-06 02:06:42

+0

我不這麼認爲。這應該像你在這裏一樣工作。 編輯:哎呀,我的錯。我想我看到了問題。 – 2014-12-06 02:12:13

回答

0

看看您的表單在您的視圖中的設置方式。它應該像下面這樣。您的LeadsController#edit方法將需要加載@contact@lead

<%= form_for [@contact, @lead] do |f| %> 
    ... 
<% end %> 

你得到從形式非嵌套資源URL的事實表明,你不使用這種模式,你應該。

另外,我認爲這是一個錯字,但你的問題,你聲明爲

resource :leads 

,而不是

resources :leads 

奇異resource有效嵌套的路線,但它意味着與你在這裏想要的不同,即每個contact有一個關聯的lead

0

使用render時,地址欄中顯示的URL將是用戶提交表單時發送給用戶的URL。在表單的情況下,它看起來像URL編輯表單提交的是:

PATCH /leads/1

當你render,它基本上將內容發送流作爲該請求的響應。因此,如果您希望render :edit呼叫轉至/contacts/1/leads/1/edit,您需要定義一條響應 PATCH /contacts/1/leads/1/edit的路線,並將其映射到您的leads#update操作,然後將表單的網址設置爲該網址。但我建議不要這樣做,因爲你會遠離Rails約定。