获取当前页面的URL,但格式不同

使用rails 2.我想要一个指向当前页面的链接(无论它是什么),它保持所有参数相同,但将格式更改为’csv’。 (设置格式可以通过在参数中使用format = csv或在路径的末尾放置.csv来完成)。 例如

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

我试着用这个hacky尝试

request.url+"&format=csv"

如果当前url中存在参数(上面的情况2),则可以正常工作,但如果没有(案例1)则会中断。 我可以在这些方面提出更多的hacky内容,例如测试请求是否有params,但我认为必须有一个更好的方法。

干杯,最大

编辑 – 顺便说一句,它不保证当前页面可能有一个与之关联的命名路由,如果相关:我们可以通过通用的“/:controller /:action /:id”路由到达那里。

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

编辑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 – 你上面的方法有一个严重的问题 – 它直接修改了params,所以如果你在调用这个使用params的方法之后有任何东西(例如will_paginate链接)那么这将获得你使用的修改版本建立你的链接。 我将其更改为在params上调用.dup然后修改重复的对象而不是直接修改params。 – @Max Williams

您可以使用:

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

@ floor的答案很棒,我发现它非常有用。

虽然可以通过使用to_params方法而不是构建自己的方法来改进该方法,如下所示:

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