【发布时间】:2021-05-27 23:06:28
【问题描述】:
我正在为旧应用程序编写一个替换系统,我们希望旧 URL 重定向到新 URL 结构。我想使用 routes.rb 中的重定向助手来完成此操作。这对于简单的情况非常有用。但是,有些遗留标识符包含点。如果标识符包含一个点,我需要:
- 不丢失标识符的后半部分
- 用破折号替换点
所以,这是我在 rspec 中对此的测试:
it "redirects requests correctly when there are dots in the eadid" do
get "/collections/MC001.02.01/c00003"
expect(response.code).to eq "301"
expect(response).to redirect_to("http://www.example.com/catalog/MC001-02-01_c00003")
end
我已经在几个地方阅读了重定向助手的文档。我看到我可以使用 constraints 正确获取整个 id,尽管有这些点。因此,这适用于获取整个 id:
get "/collections/:eadid/:componentid", to: redirect("/catalog/%{eadid}_%{componentid}"), constraints: { eadid: /([^\/])+?/ }
这将返回/catalog/MC001.02.01_c00003。关闭,但不太正确,因为我还需要用破折号替换点。
我还发现,如果我需要做一些更复杂的逻辑,例如字符串替换,我可以使用块格式,如下所示:
get "/collections/:eadid/:componentid", to: redirect { |params, request|
"/catalog/#{params[:eadid].gsub('.','-')}_#{params[:componentid]}"
}
这不起作用,因为第一个点之后的eadid 的位已被删除,我可以查看是否同时检查params 和request:
"action_dispatch.request.path_parameters"=>{:eadid=>"C0140", :componentid=>"c03411"}
我找不到配置为使用 both constraint 和 块的重定向助手的示例。对语法的猜测没有结果。有人知道这里的秘方吗?还是有更好的方法来解决我正在尝试做的事情?
谢谢!
咨询的来源:
【问题讨论】:
-
请准确说明您的“对语法的猜测没有取得成果”。评论太长了,所以我同时写一个答案
标签: ruby-on-rails redirect routes