使用轨道2.我想要一个链接到当前页面(无论是什么),保持所有参数相同,但将格式更改为“csv”. (设置格式可以通过在params中使用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
我试过这个是一个黑客的尝试
request.url“& format = csv”
如果当前URL中有参数(上述情况2),但如果没有(情况1)则会中断,则该功能正常.我可以通过这些方式提出更多的hacky的东西,例如测试请求是否具有参数,但我认为必须有一个更好的方法.
欢呼声,最大
编辑 – btw,不能保证当前页面可能有一个与之相关联的命名路由,以防相关:我们可以通过通用的“/: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(例如will_paginate链接),那么将获得你使用的修改版本建立你的链接我改变它在params上调用.dup,然后修改重复的对象,而不是直接修改params. – @麦克威廉姆斯