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

Max*_*ams 16 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 
Run Code Online (Sandbox Code Playgroud)

我试着用这个hacky尝试

request.url+"&format=csv"

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

干杯,最大

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

fl0*_*00r 24

<%= link_to "This page in CSV", {:format => :csv } %>
<%= link_to "This page in PDF", {:format => :pdf } %>
<%= link_to "This page in JPEG", {:format => :jpeg } %>
Run Code Online (Sandbox Code Playgroud)

编辑

添加助手

def current_url(new_params)
  url_for :params => params.merge(new_params)
end
Run Code Online (Sandbox Code Playgroud)

然后用这个

<%= link_to "This page in CSV", current_url(:format => :csv ) %>
Run Code Online (Sandbox Code Playgroud)

编辑2

或改善你的黑客:

def current_url(new_params)
  params.merge!(new_params)
  string = params.map{ |k,v| "#{k}=#{v}" }.join("&")
  request.uri.split("?")[0] + "?" + string
end
Run Code Online (Sandbox Code Playgroud)

编辑

重要!@floor - 你的方法有上面一个严重的问题 - 它直接修改参数,可以因此,如果你已经到使用PARAMS(例如will_paginate链接)调用此方法后得到了什么,然后,将让你用修改后的版本建立你的链接.我将其更改为在params上调用.dup然后修改重复的对象而不是直接修改params. - @Max Williams

  • 重要!@floor - 你上面的方法有一个严重的问题 - 它直接修改了params,所以如果你在调用这个使用params的方法之后有任何东西(例如will_paginate链接)那么那将获得你使用的修改版本建立你的链接.我将其更改为在params上调用.dup然后修改重复的对象而不是直接修改params. (3认同)

小智 8

您可以使用:

link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)
Run Code Online (Sandbox Code Playgroud)