rails模块学习之Controller

控制器简单介绍

一个简单的控制器中的例子

Ruby代码  

  1. class SimpleController < ApplicationController
  2. def index
  3. end
  4. end

可以看出,我们自己建立的控制器默认继承ApplicationController类。那ApplicationController类到底有什么作用呢

Ruby代码  

  1. # Filters added to this controller apply to all controllers in the application.
  2. # Likewise, all the methods added will be available for all controllers.
  3. class ApplicationController < ActionController::Base
  4. helper :all # include all helpers, all the time
  5. protect_from_forgery # See ActionController::RequestForgeryProtection for details
  6. # Scrub sensitive parameters from your log
  7. # filter_parameter_logging :password
  8. end

从上面的注释得知ApplicationController总是会包含所有的heipers以及对伪造表单的保护,在此类中定义的方法可以被所有的控制器访问同时在此添加过滤器将会应用于所有的孔控制器。

回到开头的例子

这里定义了一个方法index,这是一个空动作。里面没有包含任何指定的东西,它的默认视图为views/simple/index.rhtml,尽管我没有定义render :action => "index"。这就是Rails的约定优于配置。

甚至可以把index方法也省略掉,如

Ruby代码  

  1. class SimpleController < ApplicationController
  2. end

这样仍然能正确渲染视图index.rhtml,但这貌似也没什么意义。

控制器中的对象简介

控制器为执行实际操作的action和视图提供了一个上下文的环境,这个环境包括一个实用的对象,如request,params,cookies,response,session,flash,headers。

request介绍

request为访问的请求对象,包含一些请求相关的环境变量,部分方法如下

remote_ip;返回远程IP地址,如客户端有代理,则可能返回多个IP地址

headers;请求的环境,可以使用它来获取客户端浏览器设置的值,如:request.env[‘REMOTE_ADDR‘]

parameters;返回当前GET或POST请求的参数,Hash形式

query_string;返回请求的参数

method;返回客户端请求所使用的方法,如::delete,:get,:post

具体请参考官方文档http://api.rubyonrails.org/classes/ActionController/Request.html

params

params是Hash类型的对象,它包含了请求过程中URL或者表单传递过来的参数。例如http://localhost:3000/test/say/?test_id=1,其中传递的URL参数test_id的值1可是使用params[:test_id]或者params["test_id"]获取

cookie

cookie对象是一个类似于Hash类型的对象,它有Rails自动管理。会根据客户端发过来的名称和值进行初始化,同时也会自动向浏览器发送cookies的修改

操作cookie方法如下

Ruby代码  

  1. class SimpleController < ApplicationController
  2. def index
  3. #设置Cooke的name为:login,值为test,在一个小时后过期
  4. cookies[:login] = {
  5. :value=>"test",
  6. :expires=>1.hours.from_now
  7. }
  8. #获取cookie的数量
  9. @size = cookies.size
  10. #删除cookie
  11. cookies.delete :login
  12. #如果要删除的cookie定义了domain,则删除时也要指定domain。如
  13. #cookies.delete(:login,domain=>"test.com")
  14. end
  15. end

设置cookie的hash变量含义如下

value;cookies的值

path;cookies的路径,默认为网站根路径

domain;cookies的有效域名

expires;过期时间

secure;设置cookies是否仅传递给HTTPS服务器有效

http_only;设置cookies是否仅对HTTP服务器有效

response

Rails应答至客户端的对象。在处理的过程中,Rails生成并填充response对象,并在完成请求后根据response对象生成相应的内容反馈给客户端。

不建议直接在控制器中使用,可以使用ActionController::Base中定义的方法替代。

详细请参考官方文档:http://api.rubyonrails.org/classes/ActionController/Response.html

ActionController::Base文档地址http://api.rubyonrails.org/classes/ActionController/Base.html

session

Rails通常靠跟踪用户的session_id来区别用户并维持相应的session数据。每次在用户第一次访问的时候,Rails就会创建一个唯一的随机的32位的字符串,并以cookie的形式发送给客户。默认情况下session_id分个存储在tmp/session目录中。

可以修改config/enviroment.rb文件,让session存储在数据库或内存中。

session文档地址http://api.rubyonrails.org/classes/ActionController/Session.html

flash

flash对象是一个临时的暂存空间,主要用于两个action之间传递数据。

如下:

Ruby代码  

  1. class SimpleController < ApplicationController
  2. def index
  3. flash[:text] = "next"
  4. redirect_to :action => "next_action"
  5. end
  6. def next_action
  7. text = flash[:text]
  8. render :text => text
  9. end
  10. end

如果仅仅是将数据从控制器传到视图,而不需要到达下一个action,则可以使用flash.now对象

如:flash.now[:text] = "next"

而flash.keep则是保留上一个请求的flash变量并为维持到下一个action

如:flash.keep[:text]= "next"

headers

反馈至客户端的HTTP头信息,可以通过修改headers对象来控制反馈的HTTP头信息

文档中只有连个方法

new用于构建headers对象

[]用于取得数据

文档地址:http://api.rubyonrails.org/classes/ActionController/Http/Headers.html

控制器的应答

渲染视图模板

render(:text=>string)

指定发送给客户端文本内容,如render :text=>"text"

render(:inline=>string,[:type=>"rhtml"|"rxml"])

对字符串组成的视图模板进行渲染,并提交结果给客户端

render(:action=>action_name)

渲染当前控制器中指定action所定义的模板

render(:file=>path,[:use_full_path=>true|false])

渲染指定路径的模板文件

render(:template=>name)

渲染指定的模板

render(:partial=>name,...)

渲染局部模板

render(:nothing=>true)

返回空值

发送文件

send_data主要用于发送包含二进制数据的字符串给客户端。格式如下

send_data(data,options)

其中参数的含义如下:

:filename 指定浏览器在保存数据时使用的默认文件名

:type指定内容类型,默认为applicaiton/octet-stream

:disposition如果设置为inline则浏览器会使用内联的程序打开,设置为:attachment(默认)则浏览器会提示保存。

send_file用于发送文件的内容给客户端,不再介绍。与send_data类似。

重定向

在控制器中直接使用redirect_to进行重定向

例子:

Ruby代码  

  1. redirect_to :action => "index"
  2. redirect_to :action => "show", :id => @item
  3. redirect_to :controller => "items"
  4. redirect_to :controller => "items", :action => "show"
  5. redirect_to :controller => "items", :action => "show", :id => @item

这样也可以

redirect_to("http://www.163.com")

控制器中的过滤器

过滤器让控制器可以在执行动作方法之前或之后加入操作,其一般用来在执行动作前做认证,缓存管理或其他的鉴权处理。过滤器采用宏格式(宏格式?),出现在控制器的最顶端。过滤器可以对请求、相应、或者被过滤器执行链中的其他过滤器或动作中设定的实例变量进行操作,过滤器也可以为请求设定变量。

控制器继承可是过滤器实现向下继承,即Rails中的控制器都是继承自ApplicationController,那么在ApplicationController中添加过滤器将应用于所有的控制器。

过滤器的类型分为:方法的引用(通过符号表示)、外部类、内联方法

外部类:

使用外部多虑器可以让通用的过滤器更方便的被重用。

例子:

Ruby代码  

  1. class SimpleController < ApplicationController
  2. before_filter OutFilter
  3. def index
  4. end
  5. end
  6. class OutFilter
  7. #controller为所过滤的控制器的实例变量,使用它可以修改控制器中的任意变量
  8. def self.filter(controller)
  9. controller.logger.debug "#{controller.request.remote_ip}"
  10. end
  11. end

内联过滤器

Ruby代码  

  1. class SimpleController < ApplicationController
  2. before_filter {|controller| controller.logger.dubug "#{controller.params[‘text‘]}"}
  3. def index
  4. end
  5. end

在使用before_filter或after_filter过滤器的时候,其会将对应的过滤器加入到已有的队列中去,如果需要特别控制过滤器的执行次序可以使用prepend_before_filter和prepend_after_filter,这样使所加入的过滤器被添加到过滤器队列的开头,被最先执行。

跳过过滤器

使用skip_before_filter可以跳过父类中定义的before_filter

如: skip_before_filter:test_filter 可以跳过父类中定义的test_filter

过滤器的条件

过滤器可以指定适用的(only)和排出的(except)条件,两种方式都可以指定单一的方法或一个方法数组

如:

Ruby代码  

  1. class SimpleController < ApplicationController
  2. before_filter OutFilter,:only=>[:method1,:method2]
  3. #或者
  4. #before_filter OutFilter,:except=>[:index]
  5. def index; end
  6. def method1;end
  7. def method2;end
  8. end
时间: 2024-08-14 19:10:01

rails模块学习之Controller的相关文章

Edison 蓝牙模块 学习笔记

Edison 蓝牙模块 学习笔记 固定链接:https://www.zybuluo.com/SiberiaBear/note/212527 本笔记基于Intel Edison Bluetooth Guide官方手册完成,如有错误敬请指出. 由于个人能力有限,到最后几节内容一直拖着没有翻译,以后会补上,自己也是边学习边翻译的,还请见谅. Edison 蓝牙模块 学习笔记 基本介绍 Linux集成蓝牙 1 The bluetoothd daemon 2 Configuration 3 Applica

Spring4.0MVC学习资料,Controller中的方法详解和使用(四)

在以前,mvc的框架,基本上就是struts框架了.但是现在不一样了.springmvc出来了.spring的mvc框架不亚于struts了,springmvc出来了,我们有了更多的选择. Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是 Struts 这样的 We

Python 模块学习

模块学习: http://wsyht90.blog.51cto.com/9014030/1845737 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.datetime 11.re 12.random 13.configparser 14.traceback 15.yaml 16.itertools 17.logging 18.urllib.urllib2 19.paramiko ###

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符

Node.js笔记(0003)---Express框架Router模块学习笔记

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: Map the given param placeholder `name`(s) to the given callbac

openoffice osl模块学习1

由" can i get a char* , please?"看起: Just barely. OO.o has at least six string wrappers, although the C implementations are of little interest: rtl_String - sal/inc/rtl/string.h"Normal" string plus reference counting. rtlstring->buffe

Day5 - Python基础5 常用模块学习

Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,

python之web模块学习-- urllib

准备写一些列的 python之web模块学习,基本上涉及常用的的web模块,包括 urllib.urllib2.httplib.urlparse.requests,现在,开始我们的第一个模块的学习吧. 1  urllib简介 python urllib 模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取我们想要的数据. 2  常用方法 2.1  urlopen  -- 创建一个类文件对象 为读取指定的URL help(urllib.urlopen) urlopen(url,

Python subprocess模块学习总结

从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.commands.*不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息 一.subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec