`
酷的飞上天空
  • 浏览: 521770 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

Rails学习之控制器

阅读更多

控制器简单介绍

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

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学习教程

    本“rails学习教程”PDF文档将涵盖以上所有内容,通过详尽的实例和解释,帮助你从新手到熟手,全面掌握Rails开发。无论是想从事Web开发职业,还是想要提升个人项目开发能力,这都是一份不可多得的学习资料。

    Ruby on Rails 学习案例

    以上就是Ruby on Rails学习案例中涵盖的关键知识点,通过实践这些概念和技术,你将能够构建出功能完善的Web应用程序。在"Learning-Ruby-on-Rails-master"这个项目中,你可以找到具体的代码示例和练习,逐步加深对...

    ruby on rails 学习资料

    "ruby on rails 学习资料pdf"可能是综合性的学习指南,包含了从初学者到进阶者的各种主题,包括Rails的安装和配置、模型关系、控制器逻辑、视图渲染、部署到生产环境等。 "ruby on rails环境搭建.doc"会详细指导你...

    Rails 101 入门电子书

    - 创建控制器和视图。 - 在浏览器中查看结果。 #### 六、Rails的路由 - **概念介绍**: 路由是连接用户请求URL与应用程序逻辑的关键组件。 - **实现方式**: - 配置文件`config/routes.rb`。 - 常见的路由类型: ...

    关于rails学习中分页的示例

    这篇关于“rails学习中分页的示例”的文章可能涵盖了如何在Rails应用中实现分页的详细步骤。 在Rails中,最常用的分页库是`Kaminari`和`WillPaginate`。这里我们将以`Kaminari`为例进行讲解,因为它是近年来更受...

    rails查询学习笔记

    Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效便捷。在Rails中,数据库查询主要通过ActiveRecord来实现,这是一个强大的...

    Rails101_by_rails4.0

    Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它遵循模型-视图-控制器(MVC)的架构模式,设计用来快速开发数据库驱动的动态网页。随着Rails版本的更新迭代,此书聚焦于一个特定的版本,帮助...

    Rails项目源代码

    Rails的路由系统将URL映射到控制器的行动上,如`/sign_up`可能对应`users#new`,用于创建新用户。`config/routes.rb`文件定义了所有路由规则,包括资源路由、命名路由和自定义路由。 6. **视图模板**: 视图使用...

    Ruby on Rails Web开发学习实录随书光盘(源代码).

    2. **Rails框架核心概念**:Rails的核心概念包括路由(Routes)、控制器(Controllers)、模型(Models)、视图(Views)以及辅助方法(Helpers)。路由负责将HTTP请求映射到相应的控制器;控制器处理业务逻辑并调用...

    rails的经典学习项目

    Rails项目通常包括数据库设计、控制器逻辑、视图模板以及模型业务规则等多个部分,这都是开发者在深入学习过程中必须掌握的核心概念。 描述中重复提到"ruby on rails打包的程序",这意味着提供的压缩包可能包含了一...

    rails指南 中文版

    11. **Rails Generators**:Rails的生成器可以帮助快速创建新的控制器、模型、迁移等,大大提高了开发效率。 12. **Migrations**:Rails的迁移机制允许开发者通过Ruby代码来管理数据库结构的变化,使得数据库版本...

    中文版rails教程

    1. **生成资源(Generating Resources)**:使用`rails generate`命令可以快速创建模型、控制器、视图等文件,如`rails generate scaffold Post title:string content:text`会生成一个名为Post的资源,包含相关的...

    Rails相关电子书汇总

    通过阅读"rubyonrails21-cn.pdf"这本书,读者可以学习如何搭建Rails环境,理解MVC架构,学习数据库设计,掌握路由规则,编写控制器和视图,进行测试,以及了解如何部署Rails应用。此外,书中可能还涵盖了Rails的安全...

    Rails

    标题 "Rails" 指的是 Ruby on Rails,一个开源的Web应用程序框架,它基于Ruby编程语言,遵循MVC(模型-视图-控制器)架构模式。Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY...

    The Rails 4 Way

    - **Rails中的REST实现**:Rails默认遵循REST原则,通过资源路由和标准的控制器动作支持常见的CRUD操作。 - **资源和表示**:讨论如何将数据建模为资源,并如何通过不同的HTTP方法处理这些资源的不同状态。 **4. ...

    使用Aptana+Rails开发Rails Web应用(中文)

    接下来,我们将探讨Rails的MVC(模型-视图-控制器)架构。模型负责数据操作,视图用于展示用户界面,而控制器则作为两者之间的桥梁,处理用户请求并调用模型方法。在Aptana中,你可以直接在这些目录中编写相应的Ruby...

    ruby on rails 学习资料汇总

    在Rails框架中,"源码"标签意味着我们将深入理解其内部工作机制,包括控制器、模型、视图的实现,以及路由、数据库交互、缓存、测试等核心组件的源代码分析。通过阅读源码,开发者可以更深入地了解Rails的工作原理,...

Global site tag (gtag.js) - Google Analytics