Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 获取当前页面的url,但格式不同_Ruby On Rails - Fatal编程技术网

Ruby on rails 获取当前页面的url,但格式不同

Ruby on rails 获取当前页面的url,但格式不同,ruby-on-rails,Ruby On Rails,使用rails 2。我想要一个指向当前页面的链接(无论是什么),该链接保持所有参数不变,但将格式更改为“csv”。(可以通过在参数中设置format=csv或将.csv放在路径的末尾来设置格式)。乙二醇 我试着把这当作一种恶作剧 request.url+“&format=csv” 如果当前url中有参数(上面的案例2),这可以正常工作,但如果没有参数(案例1),则会中断。我可以根据这些思路想出更多骇客的东西,例如测试请求是否有参数,但我认为一定有更好的方法 干杯,麦克斯 编辑-顺便说一句,不能保

使用rails 2。我想要一个指向当前页面的链接(无论是什么),该链接保持所有参数不变,但将格式更改为“csv”。(可以通过在参数中设置format=csv或将.csv放在路径的末尾来设置格式)。乙二醇

我试着把这当作一种恶作剧

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)