ruby-on-rails – 获取当前页面的URL,但格式不同

使用轨道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. – @麦克威廉姆斯

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...