跳轉到內容

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)。

渲染和重定向

[編輯 | 編輯原始碼]

您將遇到兩種常用的方法來顯示資料renderredirect_to。下面的示例展示了這兩種方法是如何工作的

當用戶提交更新的資料時,此操作被呼叫

正如您所見,這兩個方法都在這個簡單的示例中被使用。每當我們成功更新產品名稱時,我們都會被重定向到產品的索引頁面。如果更新失敗,我們希望返回到編輯檢視。

def update
    @product= Product.find(params[:id])

    if @product.update_attributes(params[:name])
      redirect_to :action => 'index'
    else
      render :edit
    end
end

之間有一個重要的區別renderredirect_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

[編輯 | 編輯原始碼]

您可以使用redirect_to與render類似的方式使用,但要記住兩者之間的巨大區別renderredirect_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)方法,該方法接受要渲染的文字和區域性變數的雜湊。=

華夏公益教科書