2011-05-06 83 views
15

使用rails 2.我想要一個指向當前頁面的鏈接(不管它是什麼),它保持所有參數相同,但將格式更改爲'csv'。 (設置格式可以通過在參數中使用format = csv或在路徑末尾放置.csv來完成)。例如獲取當前頁面的url,但使用不同的格式

posts/1 
=> posts/1.csv OR posts/1?format=csv 
posts?name=jim 
=> posts.csv?name=jim OR posts?name=jim&format=csv 

我想這是一個哈克企圖

request.url+"&format=csv"

,如果有在當前的URL(上述情況2)PARAMS,但斷裂如果沒有(情況下正常工作1)。我可以根據這些方法想出更多的黑客東西,例如測試請求是否有參數,但我認爲必須有更好的方法。

歡呼,最大

編輯 - 順便說一句,它不能保證當前頁面可以有與它關聯的指定路線,如果這是相關的:控制器/:我們可以通過通用的「/已經到了那裏:行動/:ID「路線。

回答

23
<%= link_to "This page in CSV", {:format => :csv } %> 
<%= link_to "This page in PDF", {:format => :pdf } %> 
<%= link_to "This page in JPEG", {:format => :jpeg } %> 

編輯

添加輔助

def current_url(new_params) 
    url_for :params => params.merge(new_params) 
end 

然後用這個

<%= link_to "This page in CSV", current_url(:format => :csv) %> 

EDIT 2

或改善你的黑客:

def current_url(new_params) 
    params.merge!(new_params) 
    string = params.map{ |k,v| "#{k}=#{v}" }.join("&") 
    request.uri.split("?")[0] + "?" + string 
end 

編輯

重要! @floor - 你上面的方法有一個嚴重的問題 - 它直接修改參數,所以如果你在調用這個使用參數的方法之後有任何東西(例如will_paginate鏈接),那麼它會得到你使用的修改版本建立你的鏈接。我改變它在params上調用.dup,然後修改重複的對象,而不是直接修改params。 - @Max Williams

+0

美麗的:)謝謝。 – 2011-05-06 15:32:31

+0

doh,實際上,這是不好的:(它將「/ music_service_admin/schools」更改爲「/music_service_admin/schools/index.csv」。雖然索引是正確的操作,但該URL不起作用,因爲路由解釋器認爲「索引「是一個id,並去顯示行動 – 2011-05-06 15:43:38

+0

嗯,這是非常奇怪的 – fl00r 2011-05-06 15:44:47

-1

@ floor的回答很棒,我發現它非常有用。

儘管該方法可以通過使用to_params方法,而不是contructing自己,像這樣進行改進:

def current_url(new_params) 
    params.merge!(new_params) 
    "#{request.uri}#{params.to_params}" 
end 
5

您可以使用:

link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters) 
+0

雖然這個代碼示例可能可以回答這個問題,因爲它現在它不是很有幫助。請爲此答案添加一些解釋。 – 2015-01-30 12:12:24