Rails之道---><The Rails Way> 摘录(2)运用控制器

1.你的控制器僅僅是用來映射URL(包括其它的一些HTTP請求),并將你的數據模型和視圖模板串接起來,將它們的計算結果反饋給HTTP響應.

2.在實踐中,非常重要的一點是記住了解你的應用程序的各個部分不過是不同的Ruby代碼,以及當這些代碼被加載到Ruby解析器中后它們都做些什么.

3.reload! 重新載入控制臺

4.在控制器的動作中如果沒有指定任何東西,那么它的默認行為是渲染與其相對應的同名試圖模板,即每個控制器的方法都隱含了一個render命令,而render同時又是一個真實存在的方式.
exp:

def index
render :template => "demo/index"
end


5.如果一個控制器的動作不想渲染默認的模板,那么調用render方法以指定渲染其它的任何一個模板,在app/views中的任意一個模板都是可以被渲染的.(實際上,整個project里的任何一個視圖都是可以被渲染的.)

6.(1)渲染一個完全不同的模板
如果你可以在一個動作中渲染不同的模板,那么你可以通過:template或者:file參數在一個動作中渲染任意指定的模板文件.

[quote] **:template參數指定一個模板根目錄的相對路徑,默認是app/views(可修改)

**:file參數接收一個文件的絕對路徑[/quote]

render :template => "abuse/report"

app/views/abouse/report.rhtml
render :file => "/railsapps/myweb/app/views/templates/common.rhtml"


(2)渲染局部模板(局部渲染)
使用局部渲染使得你可以將模板分割成小文件,使得代碼不至于被搞得亂七八糟,同時,局部模板可以被復用

(3)渲染內聯模板代碼
類似把視圖代碼發送給瀏覽器
該功能的存在的一個主要原因是用于Rails的Ajax視圖輔助方法.
render :inline => "<%= auto_complete_result(@headings, 'name') %>"

(4)渲染文本
如果您只需要瀏覽器返回一段簡單的文本,如在應答一個Ajax請求或者其它應用程序系統接口調用時,你可以直接渲染、返回一段文本.

 render :text => 'Submission accepted'


7. render命令也可以接受一系列選項以返回特定的數據結構,通過適當地設置響應的content-type,可以方便的實現自動化處理.
(1):json
JSON是專門提供給JS使用的輕量級數據結構,其通常是將Ajax請求的響應值通過這種格式返回.(備注:ActiveRecord已經內置了對JSON的支持,所以在Rails里處理JSON是非常方便的)
render :joson => @record.to_json


(2):xml
ActiveRecord同樣內置了對XML格式的支持
render :xml => @record.to_xml


8.什么都不渲染

rendre :nothing =>  true, :status => 401

9.渲染的屬性
[quote](1):content_type 用于驗證你實際發送的內容是否是你用的:content_type指定的類型
(2):layout 指定是否需要布局模板以及使用哪個布局模板
(3):status 按照自己的狀態選擇合適的狀態碼[/quote]

[quote]常用狀態碼
307 暫時重定向(請求的資源暫時轉移向另一個URL)
401 為授權
403 禁止訪問(服務區認識這個請求,但是拒絕返回)
404 Not Found(服務器找不到請求需要的資源)
503服務不可用(服務暫時不可用)

301 永久定向
302 暫時定向
303 表示去另外的地方看看(一個303定向將告訴用戶端,不管你原來使用的是什么動作,先發個GET請求到新地址)
307 暫時重定向 (使用和原來一樣的動作給新地址發一次請求)[/quote]

8.無論渲染默認的或者指定的模板,或者是其他局部模板、文字或者其他的東西,渲染都是處理一個請求的最后一個.重定向到意思是終止當前的請求,再啟動另一個新的請求. (備注:如果你的邏輯很復雜,在完成重定向或者渲染后可以使用return來結束流程,以避免出現DoubleRenderError錯誤)

def show 
@user = User.find(params[:id])
if @user.activated?
render :action => 'activated' and return
end

end


9.Rails在控制器和視圖層傳遞的數據使用的是實例變量.典型的做法是在控制器的方法中初始化一個或者多個實例變量,然后在其對應的視圖模板中就可以使用了.

10.過濾器讓控制器可以在執行動作方法之前或者之后加入操作.其一般用來在執行動作前做認證、緩存管理或者其他的鑒權處理.過濾器采用宏格式,它們出現在你的控制器的類定義頂端,在方法定義之前.(同時為了突出過濾器的裝飾模式的本質,一般在使用過濾器時省略方法后的括號)
before_filter :require_authentication

備注:
(1)可以給過濾器傳遞任意多的符號(before_filter :security, :audit, :compress)

(2)可以拆分成單行
before_filter :security
before_filter :audit
before_filter :compress


(3)不能在控制器中以before_filter和after_filter命名的方法來創建過濾器

(4)應該將過濾器所調用的方法設定為protected或者private,這樣可以避免它們被當作公共動作而被執行.

(5)有時候你可能需要特別控制過濾器的被執行順序,在這個情況下,你可以使用prepend_before_filter和prepend_after_filter,使用這個方法所加入的過濾器,會被添加到過濾器隊列的開頭,也將被先執行.

(6)在一個類中指定的過濾器對其子類也是有效的,但有些時候,一些子類可能需要跳過其父類中指定的過濾器
skip_before_filter :authenticate

(7)可以給過濾器指定其適用的或者需要排除的條件,兩種方式都可以指定單一的方法(:only=> :index)或者一個數組(:except => [:foo, :bar])

11.除了渲染試圖模板外,Rails內置了發送流文件返回給瀏覽器到功能(在Rails中內置了兩個方法做這個事情, ActionController::Streaming module: send_data和send_file)
(1)send_data(data, options = {} )
send_data方法允許你給用戶以指定的名字發送文本或者二進制的數據
[quote]:filename給瀏覽器提供一個文件名
:type指定HTTP內容類型,默認的是application/octetstream.
:disposition 指定該文件在瀏覽器是顯示還是下載()其值只能是inline和attachment,默認是attachment).
:status指定返回給瀏覽器到應答狀態碼,默認是"200 ok"[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值