标签:
控制器简单介绍
一个简单的控制器中的例子
可以看出,我们自己建立的控制器默认继承ApplicationController类。那ApplicationController类到底有什么作用呢
从上面的注释得知ApplicationController总是会包含所有的heipers以及对伪造表单的保护,在此类中定义的方法可以被所有的控制器访问同时在此添加过滤器将会应用于所有的孔控制器。
回到开头的例子
这里定义了一个方法index,这是一个空动作。里面没有包含任何指定的东西,它的默认视图为views/simple/index.rhtml,尽管我没有定义render :action => "index"。这就是Rails的约定优于配置。
甚至可以把index方法也省略掉,如
这样仍然能正确渲染视图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方法如下
设置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之间传递数据。
如下:
如果仅仅是将数据从控制器传到视图,而不需要到达下一个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进行重定向
例子:
这样也可以
redirect_to("http://www.163.com")
控制器中的过滤器
过滤器让控制器可以在执行动作方法之前或之后加入操作,其一般用来在执行动作前做认证,缓存管理或其他的鉴权处理。过滤器采用宏格式(宏格式?),出现在控制器的最顶端。过滤器可以对请求、相应、或者被过滤器执行链中的其他过滤器或动作中设定的实例变量进行操作,过滤器也可以为请求设定变量。
控制器继承可是过滤器实现向下继承,即Rails中的控制器都是继承自ApplicationController,那么在ApplicationController中添加过滤器将应用于所有的控制器。
过滤器的类型分为:方法的引用(通过符号表示)、外部类、内联方法
外部类:
使用外部多虑器可以让通用的过滤器更方便的被重用。
例子:
内联过滤器
在使用before_filter或after_filter过滤器的时候,其会将对应的过滤器加入到已有的队列中去,如果需要特别控制过滤器的执行次序可以使用prepend_before_filter和prepend_after_filter,这样使所加入的过滤器被添加到过滤器队列的开头,被最先执行。
跳过过滤器
使用skip_before_filter可以跳过父类中定义的before_filter
如: skip_before_filter:test_filter 可以跳过父类中定义的test_filter
过滤器的条件
过滤器可以指定适用的(only)和排出的(except)条件,两种方式都可以指定单一的方法或一个方法数组
如:
标签:
原文地址:http://blog.csdn.net/qwbtc/article/details/51276078