方法
- R
实例公共方法
redirect(*args, &block) 链接
将任何路径重定向到另一个路径
get "/stories" => redirect("/posts")
这将重定向用户,同时忽略请求的某些部分,包括查询字符串等。/stories
、/stories?foo=bar
等都重定向到 /posts
。
重定向默认使用 301 Moved Permanently
状态码。这可以通过 :status
选项覆盖。
get "/stories" => redirect("/posts", status: 307)
您也可以在提供的重定向参数中使用插值
get 'docs/:article', to: redirect('/wiki/%{article}')
请注意,如果您返回的路径没有前导斜杠,则 URL 将以当前 SCRIPT_NAME 环境变量为前缀。这通常是 ‘/’ ,但在挂载的引擎或应用程序部署到网站子目录时可能有所不同。
或者,您可以使用其他语法之一
重定向的块版本允许轻松封装与相关重定向相关的任何逻辑。参数和请求作为参数提供,或者仅提供参数,具体取决于您的块接受多少个参数。需要一个字符串作为返回值。
get 'jokes/:number', to: redirect { |params, request|
path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
"http://#{request.host_with_port}/#{path}"
}
请注意,重定向块的 do end
语法不起作用,因为 Ruby 会将块传递给 get
而不是 redirect
。使用 { ... }
代替。
重定向的选项版本允许您仅提供需要更改的 URL 部分,它还支持与第一个示例类似的路径插值。
get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
get '/stories', to: redirect(path: '/posts')
这将重定向用户,同时仅更改请求的指定部分,例如最后一个示例中的 path
选项。/stories
、/stories?foo=bar
分别重定向到 /posts
和 /posts?foo=bar
。
最后,可以向 redirect 提供一个响应于调用的对象,允许您重用常见的重定向路由。call 方法必须接受两个参数,params 和 request,并返回一个字符串。
get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/redirection.rb, line 204 def redirect(*args, &block) options = args.extract_options! status = options.delete(:status) || 301 path = args.shift return OptionRedirect.new(status, options) if options.any? return PathRedirect.new(status, path) if String === path block = path if path.respond_to? :call raise ArgumentError, "redirection argument not supported" unless block Redirect.new status, block end