rails使用嵌套路由呈现操作

时间:2014-12-06 01:43:54

标签: ruby-on-rails

我有一个嵌套资源:

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

为什么不为完整的嵌套网址“渲染:编辑”帐户?我该如何解决这个问题?

2 个答案:

答案 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惯例。