基于渲染从显示视图返回路径
Go back to path from show view based on render
这让我很困惑,
我有 2 个模型 client has_many :invocies
和 invoice 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。但我认为这是一个值得借鉴的东西。
这让我很困惑,
我有 2 个模型 client has_many :invocies
和 invoice 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。但我认为这是一个值得借鉴的东西。