基于渲染从显示视图返回路径

Go back to path from show view based on render

这让我很困惑, 我有 2 个模型 client has_many :invociesinvoice belongs_to client, 我将 root 设置为索引所有 invoices 并且 invoices 也可以通过 clients show 视图访问。我的 invoice show view 中有一个后退按钮,link 返回到 invoice 所属

client:id

返回link形式invoices/show

<%= link_to 'Back', client_path(@invoice.client), class: "btn btn-primary" %>

这很好用,但是从根路径启动 invoice show 然后单击 back 并重新定向到 client show 视图真的很尴尬。有没有办法返回 root_path 或在 if 语句中显示 2 个按钮,并根据用户首先启动 invoice show view 的方式显示一个按钮?完全卡住了。

这是我的路线文件

resources :invoices, only: [:new, :create, :destroy, :index]
 resources :clients do
   resources :invoices, shallow: true
end

root 'invoices#index'

简单背影link:

link_to 'Back', :back, class: "btn btn-primary" 

在这种情况下应该这样做。它将使用 HTTP_REFERER 或 Javascript 函数转到上一页。有关详细信息,请参阅 documentation

更新:

如果您需要 "simple back link" 规则的一些例外情况,您必须创建自定义解决方案。一种这样的解决方案可能是您默认使用 link_to :back ,但在特殊情况下 通过接受自定义 "back_path" 参数来覆盖它。您可以创建自定义助手来执行此操作。

以下示例默认使用标准后退 link,但允许前一页设置一个 back_path 参数,back_link 帮助器可以理解该参数。

# application_helper.rb
def back_link(params, name: "Back", class: "btn btn-primary")
  if params[:back_path].present?
    link_to name, params[:back_path], class: class 
  else
    link_to name, :back, class: class 
  ens
end

现在您在视图中正常使用 link:

<%= back_link(params) %>

当您想覆盖默认行为时,只需传递 back_path 参数即可。您通常会在要 return 的页面上传递此参数。然后,您必须 将此参数传递到所有其他页面 and/or 重定向

举个重要的例子,从客户端 show 页面,您可以单击 link 创建新发票,然后重定向到发票 show页面,然后您要从那里单击返回 link 并再次进入客户端 show 页面。

因此,向客户端显示页面添加一个 link,back_path 参数指向此页面:

# views/clients/show.html.erb
<%= link_to 'New invoice', new_invoice_path(@client, back_path: client_path(@client)) %>

new 页面表单中,您必须添加 hidden_tag 以传递 back_path 参数:

# views/invoices/_form.html.erb
<%= hidden_field_tag 'back_path', params[:back_path] %>

接下来,在控制器的 create 操作中,您还必须在重定向时传递此参数:

# controllers/invoices_controller.rb
redirect_to invoice_url(@invoice, back_path: params[:back_path])

最后,您现在可以使用 back_link 助手来显示正确的 link:

# views/invoices/show.html.erb
<%= back_link(params) %>

我知道它很丑,但它就是这样......此外,它不是一个理想的解决方案,因为通常你希望在浏览页面时返回 links 的层次结构(并从不同的路径),这个解决方案只解决了第一个后面 link。但我认为这是一个值得借鉴的东西。