《Ruby on Rails,在Controller中指定渲染的Templates》提到Controller可以在接受到外部请求后和Model交互,经过计算之后得到需要返回的结果,之后渲染一个View。但其实除了渲染页面以外,Controller还可以将请求重定向到其他的页面。换句话说,Controller与Model交互之后有两种动作类型:一是渲染View,二是重定向到其他的页面。

重定向是什么意思呢?举个例子来说,当Controller接到一个用户想要查看某一个页面的请求后,对用户是否已经登录进行判断。如果用户已经成功登录,那么向其展示这个页面,这就是《Ruby on Rails,在Controller中指定渲染的Templates》中描述的情况。如果用户没有登录,我们本可以展示登录页面,但是一般来说还是希望用户被通过另一个请求导向另一段代码。这样做的原因之一是我们需要一块独立而公用的代码来进行登录之前的准备工作,更重要的原因是我们希望用户能够感受到他由于没有登录而被“重定向”到登录页面了。虽然示意图上请求重定向使用一个Controller自己回向自己的箭头表示,但实际上请求不是直接指向某个Controller,而是向浏览器进行了一次全新的请求。

下面来看看如何在Rails中实现重定向功能。还是用之前名为demo的Controller。

class DemoController < ApplicationController

  def hello
  end
  
  def hello_need_login
	redirect_to(:action => 'login')
  end
  
  def login
	render(:text => "login page")
  end
end


对于请求“http://localhost:3000/demo/hello”会渲染名为hello的Template。注意到浏览器的地址栏中,虽然demo/hello最终渲染了hello这个Template,但请求名称并不发生变化依然保持之前请求的样子。

对于请求“http://localhost:3000/demo/hello_need_login”会向浏览器发送重定向请求。浏览器将接受到这个请求调用名为demo的Controller的login方法。这个方法绘制了一些字符串作为标识。浏览器地址栏中的请求名称已经被显示为重定向之后的请求名称,这也是Controller最终选择渲染View还是进行重定向这两种不同动作比较明显的一个区别。