Ruby on Rails/ActionView/渲染和重定向
您已經瞭解瞭如何使用ActiveRecord管理您的資料。現在是時候展示您的資料了。檢視顯示的所有資料都來自控制器。大多數情況下,您將使用HTML,但您也可以在檢視中使用Javascript(當然可以是Rails生成的)或不同的CSS。
“約定優於配置”也是檢視的重要組成部分:正如本書開頭提到的,Rails能夠知道哪個檢視檔案屬於控制器中的哪個操作。
app/controller/products_controller.rb
def show
@product= Product.find(params[:id])
end
我們產品控制器中的這個操作假設存在一個名為
app/views/products/show.html.erb
正如您所見,該檔案有2個副檔名:一個是用於瀏覽器顯示(HTML),另一個是告訴Rails如何處理它(erb=嵌入式Ruby)。
您將遇到兩種常用的方法來顯示資料render和redirect_to。下面的示例展示了這兩種方法是如何工作的
當用戶提交更新的資料時,此操作被呼叫
正如您所見,這兩個方法都在這個簡單的示例中被使用。每當我們成功更新產品名稱時,我們都會被重定向到產品的索引頁面。如果更新失敗,我們希望返回到編輯檢視。
def update
@product= Product.find(params[:id])
if @product.update_attributes(params[:name])
redirect_to :action => 'index'
else
render :edit
end
end
之間有一個重要的區別render和redirect_to:render會告訴Rails應該使用哪個檢視(使用您可能已經發送的相同引數),但是redirect_to向瀏覽器傳送新的請求。
還記得上面的“update”操作嗎?當更新失敗時,我們希望渲染編輯檢視,使用與之前完全相同的引數,在這種情況下,我們在資料庫中查詢“id”並相應地填充頁面。如果您想渲染另一個檢視,請使用
render 'categories/show'
您也可以顯示一個完全位於您Web伺服器上的不同位置的檔案
render :file => "/apps/some_folder/app/views/offers/index"
當然,您可以渲染簡單的文字
render :text => "Hello World"
您可能已經注意到在檢視中有一個“layout”資料夾。每當您使用腳手架建立應用程式的一部分時,都會在layout中建立一個檔案。如果您使用腳手架“Products”,那麼layout中的檔案將被稱為products.html.erb。該檔案負責顯示與通用名稱匹配的網站的基本內容(在本例中是products)。每當您想要將使用者重定向到另一個佈局時,可以使用
render :layout => 'another_layout'
每當沒有合適的佈局檔案時,Rails將只使用請求檢視中提供的樣式顯示頁面。要使用控制器中整個控制器中的特定佈局,您可以在控制器中定義佈局
class ProductsController < ApplicationController
layout "my_layout"
#our actions
end
有關佈局的更多資訊,請參閱“佈局檔案”。
您可以使用redirect_to與render類似的方式使用,但要記住兩者之間的巨大區別render和redirect_to。
使用redirect_to您可以輕鬆地將使用者傳送到新的資源,例如我們產品的索引頁面。要了解有關路徑和路由的更多資訊,請參閱“路由”一章。
redirect_to products_path
非常方便的redirect_to選項是:back
redirect_to :back
將使用者送回他來的網站。
Rails中包含幾個模板系統,每個系統都旨在解決不同的問題。
- ERb - 嵌入式Ruby是Rails應用程式的預設模板系統。所有以.rhtml結尾的檔案都被視為ERb模板。
- Builder - Builder模板是程式化模板,對於渲染XML等標記非常有用。所有以.rxml結尾的模板都被視為builder模板,幷包含一個名為xml的變數,它是XmlMarkup的例項。
除了內建的模板系統外,您還可以使用ActionView::Base.register_template_handler(extension, class)方法註冊新的模板處理程式。模板處理程式必須實現initialize(base)方法,該方法接受ActionView::Base例項和render(text, locals)方法,該方法接受要渲染的文字和區域性變數的雜湊。=