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

时间:2011-05-06 15:23:55

标签: ruby-on-rails

使用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>

3 个答案:

答案 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