2011-05-06 85 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