了解知识
在《Ruby on Rails,Routes配置routes.rb及请求解析规则》中我们了解了如何配置Routes来确定那个Controller和Action被调用,之后的工作就完全由Controller接管了。
很自然Controller的工作就是“控制”,在这里经常会出现很多if,else之类的判断语句。比如说“如果能够从数据库中取得某某,那么去做这个,如果没有能够取得某某,那么去做那个”。或者“如果用户已经成功登陆,那么转向某个页面,如果没有登陆,那么转向登陆页面”等等。
归结起来,Controller的工作主要有两个方面:其一是与Model交互以获取用于显示的信息。其二是转向适当的页面并触发其绘制。
那么Controller是如何确定转向和绘制哪个页面的呢?在《Ruby on Rails,创建最简单的视图/控制器单元Hello World》中我们创建了位于名为demo的Controller位于app/controllers/demo_controller. rb以及名为index的Templates位于app/views/demo/index.html.erb。
 
class DemoController < ApplicationController  
  def index  
  end  
end  
 
在接收到http://localhost:3000/demo/index的请求时,demo(Controller)中的index方法会被调用,然后自动转向index(Templates),这是Rails中内建的机制。
为了演示Controller的工作原理,再建立一个新的名为hello的Templets位于app/views/demo/hello.html.erb。
 
<h1>Demo#hello</h1>  
<p>Hello Page!</p>  
 
请注意,在demo(Controller)中并没有一个名叫hello的方法,看看在浏览器中输入http://localhost:3000/demo/hello会怎么样,Rails会尝试调用demo(Controller)中的hello方法,如果没有这个方法也无妨,跳过这个环节直接显示hello(Templates)。
 
如果请求一个并不存在的Templates会怎么样,浏览器中输入http://localhost:3000/demo/something。demo(Controller)中没有名叫something的方法,跳过去显示something(Templates)。但是我们没有这个Templates,页面提示错误了。
 
那么,在demo(Controller)中到底做了什么呢?实际上
 
class DemoController < ApplicationController  
  def index  
  end  
end  
 
 
class DemoController < ApplicationController  
  def index  
    render('demo/index');  
  end  
end  
 
的意义是一样的,还有别的写法如
 
class DemoController < ApplicationController  
  def index  
    render('demo/index');  
  end  
end  
 
或者,由于当前就在demo(Controller)中即可省去前面的目录名写成
 
class DemoController < ApplicationController  
  def index  
    render('index');  
  end  
end  
 
当然了前面那种什么都不写的方式最为简便。:)
标签: Rails
扩展知识