一、心得體會
1、今天主要完成了什么?
- 花了5個小時看了Rails guide 4的視圖和Controller部分
- 2個小時看代碼
- 1小時試題
2、今天主要的收獲是什么?
- Rails的視圖很多標簽需要熟悉
- 原來這就是Rails全棧
- controller的過濾器
3、今天的狀態如何?
昨天睡的晚,今天竟然狀態還不錯,就是中午的時候,太困了,睡了一會
4、今天的犯了哪些錯誤?
5、還剩什么工作需要完成?
明天把今天做的題目再好好做一遍
二、讀書筆記
View
- 模板、局部視圖和布局的最佳使用方法
- View提供了哪些幫助方法,如何自己編寫幫助方法?
- 如何使用本地化視圖
- 如何在Rails之外的程序中使用Action View
View和COntrolller是Pack的兩個主要組件
模板、視圖和布局
什么是ERB?什么是Build::XmlMarkup?
Rails支持多種模板系統,通過文件擴展名加以區分。
在ERB中,可以使用<% %>和<%= %>標簽引入Ruby代碼。<% %>標簽用來執行Ruby代碼,沒有返回值,例如條件判斷、循環或代碼塊。<%= %>用來輸出結果。
例如下面的代碼,循環遍歷名字:
Builder
適合生成XML文檔,在擴展名為.builder的模板中,可以直接使用名xml的XmlMarkup對象。
模板緩存
默認情況下,Rails會把各個模板都編譯成一個方法,這樣才能渲染視圖。開發環境中,修改模板文件后,Rails會檢查文件的修改時間,然后重新編譯。
AS和object選項
默認情況下,ActiveView::Partials::PartialRanderer對象存在一個本地變量中,變量名和模板名相同,所以,如果有以下代碼:
as選項可以為這個本地變量指定一個不同的名字。例如,如果想用item代替product,可以這么做:
<%= render partial: "product", as: "item" %>
object選項可以直接指定要在局部視圖中使用的對象。如果模板中的對象在其他地方(例如,在其他實例變量或本地變量中),可以使用這個選項使用。
<%= render partial: "product", object: @item %>
代替
<%= render partial: "product", locals: {product: @item} %>
object和as選項還可同時使用:
渲染集合
在模板中經常需要遍歷集合,使用子模板渲染各元素,這種需求可使用一個方法實現,把數組傳入該方法,然后使用局部視圖渲染各元素。
例如下面這個例子,渲染所有產品:
間隔模板
視圖路徑
Action View提供的幫助方法簡潔。
RecordTagHelper
這個模塊提供的幫助方法用來生成記錄的容器標簽,例如div,渲染Active Record對象時。
BenchmarkHelper
banchmark
這個方法可以計算模板中某個代碼塊的執行時間,然后把結果寫入日志,可以耗時的操作或瓶頸操作放入benchmark代碼塊中。
CacheHelper
cache
這個方法緩存視圖片段,而不是整個動作或頁面。
常用來緩存目錄,新話題列表,靜態HTML片段等,此方法接受一個代碼塊。
FormHelper
Rails布局和視圖渲染
- 如何使用Rails內建的各種渲染方法;
- 如何穿件多個內容區域的布局
- 如何使用局部視圖去除重復
- 如何使用嵌套布局
概覽:各組件之間的協作
創建響應:
從控制器的角度看,創建HTTP響應有三種方法:
- 調用render方法,向瀏覽器發送一個完整的響應;
-調用redirect_to方法,向瀏覽器發送一個HTTP重定向狀態碼。
- 調用head方法,向瀏覽器發送只含報頭的響應。
渲染視圖
Render方法,大多數情況ActionController::Base#render方法都能滿足需求,而且還有多種定制方式,可以渲染Rails模板的默認視圖、指定的模板、文件、行間代碼或者什么也不渲染。
渲染的內容格式可以是文本,JSON或XML。而且還可以設置響應的內容類型和HTTP狀態碼。
渲染JSOn
render json: @product
渲染XML
Rails xml: @product
渲染普通的JavaScript
Rails能渲染普通的JavaScript:
render js: "alert('Hello Rails')"
這種方法會把MIME設為text/javascript,再把指定的字符串發給瀏覽器。
渲染原始的主體
調用render方法時使用:body選項,可以不設置內容類型。
把原始的內容發送給瀏覽器:
render body: "raw"
render 方法一般可接受四個選項:
- :content_type
- :layout
- :location
- :status
默認情況下,Rails渲染得到的結果內容類型為text/html,如果使用:json選項,內容類型為application/json;如果使用:xml選項,內容類型為application/xml。如果需要修改內容類型,可使用:content_type選項。
render file: filename, content_type: "application/rss"
查找布局
查找布局時,Rails首先查看app/views/layouts文件夾中是否有控制器同名的文件,例如,渲染PhotosController控制器中的動作會使用app/views/layouts/photos.html.erb。
指定控制器所用布局
在控制器中使用layouts方法,可以改寫默認使用的布局約定。例如:
運行時選擇布局
可以使用一個Symbol,在處理請求時選擇布局:
條件布局
如果當前用戶是特殊用戶,會使用一個特殊布局渲染產品視圖。
還可使用行間方法,例如Proc,決定使用哪個布局。如果使用Proc,其代碼塊可以訪問controller實例,這樣就能根據當前請求決定使用哪個布局:
條件布局
在控制器中指定布局時可以使用:only和:except選項,這兩個選項的值可以是一個方法或一個方法名數組,這些方法都是控制器中的動作:
布局繼承
避免雙重渲染錯誤
大多數Rails開發者遲早都會看到一個錯誤消息
使用redirect_to方法
設置不同的重定向狀態碼
調用redirect_to
render和redirect_to的區別
render不會自行目標動作中的任何代碼
redirect_to 重定向,向瀏覽器訪問/books/,瀏覽器收到指令后,向控制器的index動作發起請求,控制器從數據庫中取出所有圖書,渲染index模板,將其返回瀏覽器,在屏幕上顯示所有圖書。
在小型程序中,額外增加的時間不是個問題,如果響應時間很重要,這個問題就值得關注了。
使用head構建只返回報頭的響應
head方法可以只把報頭發給瀏覽器,還可使用意圖更明確的render :nothing達到同樣的目的。head方法的參數是HTTP狀態碼的符號形式。
布局的結構
靜態資源標簽幫助方法
使用image_tag鏈接圖片
使用video_tag鏈接視頻
video_tag幫助方法為指定的文件生成HTML5<video>標簽。
<%= video_tag "movie.ogg" %>
理解yield
在布局中,yield表明一個區域,渲染的視圖會插入這里,最簡單的情況是只有一個yield,此時渲染的整個視圖都會插入整個區域:
還可以這樣表示:
<html>
<head>>%= yield %></head>
<body><%= yield %></body>
</html>
視圖的主體會插入未命名的yield區域,要想在具名yield區域插入內容,得使用content_for方法。
使用content_for方法
content_for方法在布局的具名yield區域插入內容,例如,下面的視圖會在前一節的布局中插入內容:
使用局部視圖
把表單綁定到對象上
雖然上述用法很方便,但卻不是最好的使用方式。
Action Controller
- 請求如何進入控制器
- 如何限制傳入控制器的參數
- 為什么以及如何把數據儲存在會話或cookie中
- 處理請求時,如何使用過濾器執行代碼
- 如何使用Action Controller內建的HTTP身份認證功能
- 如何把數據流直發用戶的瀏覽器
- 如何過濾敏感信息,不寫入程序的日志
- 如何處理請求過程中可能出現的異常
控制器命名約定
Rails控制器的命名習慣是,最后一個單詞使用復數形式,但也是有例外,比如ApplicationController。例如:用ClientsController,而不是ClientController;用SiteAdminsController,而不是SiteAdminController或SitesAdminsController
方法和動作
控制器是一個類,繼承自ApplicationController,和其他類一樣,定義了很多方法,程序接到請求時,路由決定運行哪個控制器和哪個動作,然后創建該控制器的實例,運行和動作同名的方法。
參數
在控制器的動作中,往往需要獲取用戶發送的數據,或其他參數,在網頁程序中參數分為兩類,第一類隨URL發送,叫做“請求參數”,即URL?符號后面的部分,第二類經常成為“POST”數據。
此時,params[:ids]的值是['1', '2', '3']。注意,參數的值始終是字符串,Rails不會嘗試轉換類型。
JSON參數
路由參數
健壯參數
嵌套參數
不用健壯參數
會話
Flash消息
cookies
渲染XML和JSON數據
class UsersController < ApplicationController
def index
@uses = User.all
respond_to do |format|
format.html
format.xml { render xml: @users }
format.json { render json: @users }
end
end
end
過濾器(filter)
過濾器(filter)是一些方法,在控制器動作之前、之后,或者前后運行。
過濾器會繼承,如果applicationController中定義了過濾器,那么程序的每個控制器都可使用。
后置過濾器和環繞過濾器
過濾器的其他用法
防止請求偽造
request和respond對象
HTTP身份認證
- 基本身份認證
- HTTP摘要身份認證
數據流和文件下載
發送文件
使用REST的方式下載文件
任意數據的實時流
過濾日志
異常處理
強制使用HTTPS協議