2014-12-06 117 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约定。