2016-03-17 22 views
0

這是混淆了我這麼多, 我有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' 

回答

2

一個簡單的反向鏈接:

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

應該在這種情況下做的。它將使用HTTP_REFERER或Javascript函數來轉到上一頁。有關更多信息,請參閱documentation

更新:

我你需要一些例外「簡單的反向鏈接」的規則,你必須創建一個定製的解決方案。一種這樣的解決方案可能是,默認情況下使用link_to :back,但通過在特殊情況下接受自定義「back_path」參數來覆蓋它。你可以創建一個自定義幫手來做到這一點。

以下示例默認使用標準後鏈接,但允許上一頁設置back_link幫助程序將會理解的參數back_path

# 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 PARAM。您通常會在要返回的頁面上傳遞此參數。然後,您必須通過所有更多頁面和/或重定向傳遞此參數。

說,對於非簡單的例子,從客戶show頁面,您可以點擊一個鏈接來創建一個新的發票,然後被重定向到發票show頁面,並從那裏,你要點擊後面的鏈接,並得到再次向客戶端show頁面發送。

所以,添加一個鏈接到客戶端顯示一個頁面,使用back_path PARAM回指向此頁面:

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

new頁面表單,你必須添加一個hidden_tag轉嫁back_path PARAM:

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

接下來,在控制器的create行動,你也將有重定向時通過這個PARAM:

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

最後,您現在可以使用back_link助手來顯示正確的鏈接:

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

我知道這是醜陋的,但是這就是事情是這樣的......而且這不是一個理想的解決方案,通常你想當您瀏覽頁面時(從不同路徑進入頁面),該解決方案僅解決第一個後端鏈接時的後端鏈接層次結構。但我認爲這是建立在某種意義上的。

+0

這是正常的,除了當一個新的發票創建時,我正在重定向到'show',所以從那裏連接回你回到'新的發票形式' – Aloalo