`
酷的飞上天空
  • 浏览: 517575 次
  • 性别: 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

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics