跳至内容 跳至搜索
方法
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'))
# 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