使用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"
如果当前网址中存在params(上面的情况2),则可以正常工作,但如果没有(情况1)则会中断。我可以在这些方面提出更多的hacky内容,例如测试请求是否有params,但我认为必须有更好的方法。
欢呼,最大编辑 - 顺便说一下,不能保证当前页面可以有一个与之关联的命名路由,如果相关的话:我们可以通过通用的“/:controller /:action /:id”路由到达那里。 / p>
答案 0 :(得分: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 ) %>
编辑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
答案 1 :(得分:7)
您可以使用:
link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)
答案 2 :(得分:-1)
@ floor的答案很棒,我发现它非常有用。
尽管可以使用to_params方法改进方法,而不是构建自己的方法,如下所示:
def current_url(new_params)
params.merge!(new_params)
"#{request.uri}#{params.to_params}"
end