Day19 心得體會&讀書筆記

一、心得體會
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協議

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容