控制器简单介绍
一个简单的控制器中的例子
class SimpleController < ApplicationController
def index
end
end
可以看出,我们自己建立的控制器默认继承ApplicationController类。那ApplicationController类到底有什么作用呢
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
# Scrub sensitive parameters from your log
# filter_parameter_logging :password
end
从上面的注释得知ApplicationController总是会包含所有的heipers以及对伪造表单的保护,在此类中定义的方法可以被所有的控制器访问同时在此添加过滤器将会应用于所有的孔控制器。
回到开头的例子
这里定义了一个方法index,这是一个空动作。里面没有包含任何指定的东西,它的默认视图为views/simple/index.rhtml,尽管我没有定义render :action => "index"。这就是Rails的约定优于配置。
甚至可以把index方法也省略掉,如
class SimpleController < ApplicationController
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方法如下
class SimpleController < ApplicationController
def index
#设置Cooke的name为:login,值为test,在一个小时后过期
cookies[:login] = {
:value=>"test",
:expires=>1.hours.from_now
}
#获取cookie的数量
@size = cookies.size
#删除cookie
cookies.delete :login
#如果要删除的cookie定义了domain,则删除时也要指定domain。如
#cookies.delete(:login,domain=>"test.com")
end
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之间传递数据。
如下:
class SimpleController < ApplicationController
def index
flash[:text] = "next"
redirect_to :action => "next_action"
end
def next_action
text = flash[:text]
render :text => text
end
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进行重定向
例子:
redirect_to :action => "index"
redirect_to :action => "show", :id => @item
redirect_to :controller => "items"
redirect_to :controller => "items", :action => "show"
redirect_to :controller => "items", :action => "show", :id => @item
这样也可以
redirect_to("http://www.163.com")
控制器中的过滤器
过滤器让控制器可以在执行动作方法之前或之后加入操作,其一般用来在执行动作前做认证,缓存管理或其他的鉴权处理。过滤器采用宏格式(宏格式?),出现在控制器的最顶端。过滤器可以对请求、相应、或者被过滤器执行链中的其他过滤器或动作中设定的实例变量进行操作,过滤器也可以为请求设定变量。
控制器继承可是过滤器实现向下继承,即Rails中的控制器都是继承自ApplicationController,那么在ApplicationController中添加过滤器将应用于所有的控制器。
过滤器的类型分为:方法的引用(通过符号表示)、外部类、内联方法
外部类:
使用外部多虑器可以让通用的过滤器更方便的被重用。
例子:
class SimpleController < ApplicationController
before_filter OutFilter
def index
end
end
class OutFilter
#controller为所过滤的控制器的实例变量,使用它可以修改控制器中的任意变量
def self.filter(controller)
controller.logger.debug "#{controller.request.remote_ip}"
end
end
内联过滤器
class SimpleController < ApplicationController
before_filter {|controller| controller.logger.dubug "#{controller.params['text']}"}
def index
end
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)条件,两种方式都可以指定单一的方法或一个方法数组
如:
class SimpleController < ApplicationController
before_filter OutFilter,:only=>[:method1,:method2]
#或者
#before_filter OutFilter,:except=>[:index]
def index; end
def method1;end
def method2;end
end
分享到:
相关推荐
《Rails之道》按照Rails的各个子系统进行组织编排,分别介绍了Rails的环境、初始过程、配置和日志记录,Rails的分配器、控制器、页面生成和路由,REST、资源和Rails,ActiveRecord的基础、关联、验证和高级技巧,...
全书共分17章,主要内容包括:搭建ruby on rails开发平台、ruby语言的基础知识(像控制语句、面向对象、数组和块等)、文件处理、数据库持久化、rails控制器和路由、视图模板以及发送邮件和ajax等。 《ruby on rails ...
Web应用开发: 学习使用Rails框架开发Web应用的全过程,包括路由配置、控制器编写、视图渲染等方面的技术。 数据库操作: 掌握Rails框架中对数据库的操作方法,包括模型定义、数据迁移、数据查询等数据库操作技巧。 ...
Rails 3 的学习资料 Rails 版本 3,该版本继续保持工具包的快速改进。与以往相同,该软件仍然非常 “固执”,即仍然偏向于约定优于配置...如呈现部件和模板等控制器功能,现在也是相互独立的,并且可以嵌入到任一库中。
mini-rails实现了从套接字到控制器的层层封装,并注释了Rails源码中相应模块的位置,可作为学习Rails源码的目录或大纲; Socket -> WEBrick GenericServer -> WEBrick ...
了解Rails如何自动加载控制器 从头开始创建控制器/视图/模型 了解有关请求/响应的信息 创建我自己的对象关系映射以与数据库对话,以及 了解机架中间件。 “通过Rebuild Rails,您将构建一个MVC Web框架,其结构类似...
我将指导您通过构建Instagram应用程序逐步学习Ruby on Rails。 完成这个项目后,您会学到什么? 如何启动一个新的Rails应用程序? Craft的设计系统 了解MVC(模型-视图-控制器)体系结构 模型:Active Record迁移...
从Rails控制器渲染纯文本 从Rails控制器渲染JSON 介绍 在上一课中,我们重新讨论了默认的Rails MVC结构,最后,呈现了一个ERB文件。 但是,Rails可以呈现多种类型的内容。 在本课程中,我们将研究在构建Rails API时...
从Rails控制器渲染纯文本 从Rails控制器渲染JSON 介绍 在上一课中,我们重新讨论了默认的Rails MVC结构,最后,呈现了一个ERB文件。 但是,Rails可以呈现多种类型的内容。 在本课程中,我们将研究在构建Rails API时...
在本文的代码中,我们将简要回顾一下Rails的MVC结构以及通过Rails控制器进行渲染。 本课提供了Rails应用程序的基本文件,但是一些文件需要本自述文件的内容才能起作用。 审查MVC结构 模型,视图,控制器结构是关注...
在这段代码中,我们将简要回顾一下Rails的MVC结构以及通过Rails控制器进行渲染。 本课提供了Rails应用程序的基本文件,但是一些文件需要本自述文件的内容才能起作用。 审查MVC结构 模型,视图,控制器结构是关注点...
在这段代码中,我们将简要回顾一下Rails的MVC结构以及通过Rails控制器进行渲染。 本课提供了Rails应用程序的基本文件,但是一些文件需要本自述文件的内容才能起作用。 审查MVC结构 模型,视图,控制器结构是关注点...
存根和依赖注入无轨演示测试其他情况测试电子邮件测试文件上传测试第三方API 测试您自己的API 试驾完整功能功能规格激励控制器创造鼓励画龙点睛 具有RSpec,Capybara和Cucumber的测试驱动Rails 我在TDD Rails上的...
从头开始创建Rails API 学习目标 创建仅API的Rails构建 介绍 在最后几节课中,我们了解了如何轻松调整Rails的MVC结构来呈现JSON。 Rails足够灵活,能够响应不同的格式,并且可以立即使用。... 控制器将继承自Ac
由于这个项目,我了解了有关Ruby on Rails,模型-视图-控制器范例,嵌入式Ruby和测试(TDD和BDD)的更多信息。笔记: 已知问题:来宾(未经身份验证)用户仍然可以下订单。 下一步,应禁用此选项。主页管理员类别...
用法: Viewmaster 需要一个 current_user 变量才能从控制器访问,就像许多身份验证解决方案一样。 例如与设计将工作得很好。配置/路由.rb # mount Viewmaster routes mount Viewmaster :: Engine , at : "/"配置/...
如果要学习如何构建API,请切换到以下分支之一: 设置Rails API 单元测试模型和瓶子 创建API 测试API 苏亚连载 以上也是本教程的推荐顺序。 如果您是Rails的初学者,请从分支设置setting-up-rails-api开始。 ...
该存储库演示了对现有应用程序的增量测试,该测试从未经测试的代码库开始,直至模型,控制器,功能和请求规范。 每个章节的进度在此存储库中都有一个特定的分支。 有关详细信息,请参见本书的第1章。 使用Git,您...
欢迎来到 Rails是一个Web应用程序框架,其中包括根据Model-View-Control模式创建... 控制器和视图由动作包处理,该动作包通过其两个部分处理这两层:动作视图和动作控制器。 由于这两层的相互依赖关系,它们被捆绑在
好的,也许不是整个在线商店,但至少是一些在线商店的布局和控制器。 您不仅将学习如何创建布局以及如何获得使用该布局的操作,而且还将学习如何覆盖默认值并在操作级别指定布局。 默认布局 新建一个名为...