rails模組學習之Controller
控制器簡單介紹
一個簡單的控制器中的例子
Ruby程式碼- class SimpleController < ApplicationController
- def index
- end
- end
可以看出,我們自己建立的控制器預設繼承ApplicationController類。那ApplicationController類到底有什麼作用呢
Ruby程式碼- # 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方法也省略掉,如
Ruby程式碼- 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
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程式碼- 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物件生成相應的內容反饋給客戶端。
session
Rails通常靠跟蹤使用者的session_id來區別使用者並維持相應的session資料。每次在使用者第一次訪問的時候,Rails就會建立一個唯一的隨機的32位的字串,並以cookie的形式傳送給客戶。預設情況下session_id分個儲存在tmp/session目錄中。
可以修改config/enviroment.rb檔案,讓session儲存在資料庫或記憶體中。
flash
flash物件是一個臨時的暫存空間,主要用於兩個action之間傳遞資料。
如下:
Ruby程式碼- 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物件
[]用於取得資料
控制器的應答
渲染檢視模板
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程式碼- 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
這樣也可以
控制器中的過濾器
過濾器讓控制器可以在執行動作方法之前或之後加入操作,其一般用來在執行動作前做認證,快取管理或其他的鑑權處理。過濾器採用巨集格式(巨集格式?),出現在控制器的最頂端。過濾器可以對請求、相應、或者被過濾器執行鏈中的其他過濾器或動作中設定的例項變數進行操作,過濾器也可以為請求設定變數。
控制器繼承可是過濾器實現向下繼承,即Rails中的控制器都是繼承自ApplicationController,那麼在ApplicationController中新增過濾器將應用於所有的控制器。
過濾器的型別分為:方法的引用(通過符號表示)、外部類、內聯方法
外部類:
使用外部多慮器可以讓通用的過濾器更方便的被重用。
例子:
Ruby程式碼- 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
內聯過濾器
Ruby程式碼- 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)條件,兩種方式都可以指定單一的方法或一個方法陣列
如:
Ruby程式碼- class SimpleController < ApplicationController
- before_filter OutFilter,:only=>[:method1,:method2]
- #或者
- #before_filter OutFilter,:except=>[:index]
- def index; end
- def method1;end
- def method2;end
- end