我有一个嵌套资源:
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
当触发else时,它会将页面呈现为:
http://localhost:3000/leads/1
应该是:
http://localhost:3000/contacts/1/leads/1/edit
为什么不为完整的嵌套网址“渲染:编辑”帐户?我该如何解决这个问题?
答案 0 :(得分:1)
查看您的表单在视图中的设置方式。它应该类似于以下内容。您的LeadsController#edit
方法需要同时加载@contact
和@lead
。
<%= form_for [@contact, @lead] do |f| %>
...
<% end %>
您从表单中获取非嵌套资源网址的事实表明您没有使用此模式,您应该这样做。
另外,我认为这是一个拼写错误,但在你的问题中,你是将嵌套路线声明为
resource :leads
而不是
resources :leads
单数resource
是有效的,但它意味着与您在此处的意图不同,即每个contact
都有一个关联的lead
。
答案 1 :(得分:0)
使用render
时,地址栏中显示的网址将是用户提交表单时发送到的网址。对于您的表单,它看起来像编辑表单提交的URL是:
PATCH /leads/1
当您render
时,它基本上将内容流作为对该请求的响应发送。因此,如果您希望render :edit
调用转到/contacts/1/leads/1/edit
,则需要定义响应的路由
PATCH /contacts/1/leads/1/edit
并将其映射到您的leads#update
操作,然后将表单的网址设置为该网址。但是我建议反对,因为你偏离了Rails惯例。