Ruby on rails 获取当前页面的url,但格式不同
使用rails 2。我想要一个指向当前页面的链接(无论是什么),该链接保持所有参数不变,但将格式更改为“csv”。(可以通过在参数中设置format=csv或将.csv放在路径的末尾来设置格式)。乙二醇 我试着把这当作一种恶作剧Ruby on rails 获取当前页面的url,但格式不同,ruby-on-rails,Ruby On Rails,使用rails 2。我想要一个指向当前页面的链接(无论是什么),该链接保持所有参数不变,但将格式更改为“csv”。(可以通过在参数中设置format=csv或将.csv放在路径的末尾来设置格式)。乙二醇 我试着把这当作一种恶作剧 request.url+“&format=csv” 如果当前url中有参数(上面的案例2),这可以正常工作,但如果没有参数(案例1),则会中断。我可以根据这些思路想出更多骇客的东西,例如测试请求是否有参数,但我认为一定有更好的方法 干杯,麦克斯 编辑-顺便说一句,不能保
request.url+“&format=csv”
如果当前url中有参数(上面的案例2),这可以正常工作,但如果没有参数(案例1),则会中断。我可以根据这些思路想出更多骇客的东西,例如测试请求是否有参数,但我认为一定有更好的方法
干杯,麦克斯
编辑-顺便说一句,不能保证当前页面可以有一个与之关联的命名路由,以防相关:我们可以通过通用“/:controller/:action/:id”路由到达那里
那就用这个
<%= link_to "This page in CSV", current_url(:format => :csv ) %>
编辑
重要@floor-您上面的方法有一个严重的问题-它直接修改params,因此,如果您在调用此方法后得到任何使用params的内容(例如will_paginate links),则将获得用于构建链接的修改版本。我将其更改为在参数上调用.dup,然后修改复制的对象,而不是直接修改参数@马克斯·威廉姆斯(Max Williams)@floor)的回答很好,我发现它非常有用 虽然可以通过使用to_params方法而不是构建自己的方法来改进该方法,例如:
def current_url(new_params)
params.merge!(new_params)
"#{request.uri}#{params.to_params}"
end
您可以使用:
link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)
doh,实际上,这不好:(它将“/music\u service\u admin/schools”更改为“/music\u service\u admin/schools/index.csv”。虽然索引是正确的操作,但该url不起作用,因为路由解释器认为“index”是一个id并转到show action.EDIT 1也有同样的问题,即/resources=>/resources/index.csvIMPORTANT!@floor-您上面的方法有一个严重的问题-它直接修改params,因此如果您在调用此使用params的方法(例如将分页链接)后得到任何结果然后这将获得用于构建链接的修改版本。我将其更改为调用.dup on params,然后修改复制的对象,而不是直接修改params。使用
request.query\u parameters
而不是params
来获取参数效果更好,因为params
包含controller
和page
参数。这可能是不安全的,因为params
是用户输入。我相信在Rails 5上,这实际上会产生一个错误,例如“试图从未经清理的请求参数生成URL!”虽然这个代码示例可能会回答这个问题,但它现在并没有太大帮助。请对此答案添加一些解释。
<%= link_to "This page in CSV", current_url(:format => :csv ) %>
def current_url(new_params)
params.merge!(new_params)
string = params.map{ |k,v| "#{k}=#{v}" }.join("&")
request.uri.split("?")[0] + "?" + string
end
def current_url(new_params)
params.merge!(new_params)
"#{request.uri}#{params.to_params}"
end
link_to "text of link", your_controller_path(format:'csv',params: request.query_parameters)