【问题标题】:Go back to path from show view based on render基于渲染从显示视图返回路径
【发布时间】:2016-03-17 22:39:26
【问题描述】:

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

返回链接表单发票/显示

<%= 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'

【问题讨论】:

    标签: ruby-on-rails routes link-to


    【解决方案1】:

    一个简单的反向链接:

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

    在这种情况下应该这样做。它将使用HTTP_REFERER 或Javascript 函数来访问上一页。请参阅documentation 了解更多信息。

    更新:

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

    以下示例默认使用标准反向链接,但允许上一页设置 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
    

    现在您在视图中正常使用该链接:

    <%= back_link(params) %>
    

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

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

    所以,添加一个指向客户展示页面的链接,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 帮助器来显示正确的链接:

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

    我知道它很丑,但它就是这样......此外,它不是一个理想的解决方案,因为通常您在浏览页面时需要反向链接的层次结构(并从不同的路径进入页面),这个解决方案可以解决只有第一个反向链接。但我认为这是值得借鉴的。

    【讨论】:

    • 这没关系,除非创建新发票时我会重定向到show,因此从那里链接回来会将您带回new invoice form
    猜你喜欢
    • 2013-06-10
    • 2015-11-04
    • 1970-01-01
    • 2016-02-09
    • 2018-12-19
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多