2015-10-19 41 views
0

這是生成的默認Rails代碼。我理解代碼的作用(來自文檔中的解釋),但不瞭解它的作用。rails中的`respond_to`函數如何工作?

1 class PostsController < ApplicationController 
    2 # GET /posts 
    3 # GET /posts.json 
    4 def index 
    5  @posts = Post.all 
    6 
    7  respond_to do |format| 
    8  format.html # index.html.erb 
    9  format.json { render json: @posts } 
10  end 
11 end 

我明白了什麼:

  • Post.all返回其保存在 實例變量@posts
  • respond_to函數採用默認 「塊」的所有帖子的數組(匿名功能塊需要一個參數 「格式」
  • 根據請求的格式,返回相應的輸出

我不明白:

  • 那如何實際工作?第8行調用一個函數html方法format對象,不管通過什麼格式。 html方法有什麼作用?爲什麼每次都調用這兩種方法?他們?
  • 爲什麼json方法需要一個參數(塊調用渲染),但html方法不需要任何參數
  • ,這種功能回到什麼?它看起來像返回json方法的返回值。

我是ruby和rails新手,我正在開始使用示例,希望詳細瞭解每行代碼。

+4

http:// stackoverflow。com/questions/9492362/rails-how-do-respond-block-work – rmagnum2002

回答

2

format上調用的方法告訴Rails響應類型可用。在上面的例子中,Rails被告知2個可接受的響應類型(按照首選項的順序)是html和json。

Rails根據給定的首選項排序和請求的標題選擇響應類型。做出該選擇後,調用與所選格式相對應的塊。在那之前傳遞給格式方法的塊還沒有被調用,只是在需要響應類型時才保存。

如果響應類型沒有阻止,則表示應該採用該響應類型的默認動作。在'html'的情況下,這意味着「找到一個html模板並渲染它」,類似於在動作結束時發生的隱式渲染。

ruby​​中的所有方法都有一個返回值,但是這個方法的返回值沒有記錄爲特別的東西 - 不要依賴它。

+0

何時調用索引方法,何時傳遞給respond_to的塊被調用?每個請求都需要調用它們,或者在啓動服務器時調用一次? 'format.html'方法如何訪問'@ posts'實例變量?我希望它是rails magic的一部分,而不是默認的ruby。因此,只有在傳遞給'respond_to'的塊內部可以寫入的代碼是'format'函數的方法調用(或者其他方式來告訴rails不同的響應類型)? – balki

+0

這發生在每個請求上。你可以在respond_to塊內寫任何你想要的東西。 –

0

評論(Rails: How does the respond_to block work?)中的答案是您需要的基礎級解釋。

源代碼(我認爲?)可以在這裏找到: /lib/action_controller/metal/mime_responds.rb


MIME

底線與MIME (Multipurpose Internet Mail Extensions) types你發送到您的應用程序的respond_to塊交易。

這是你正在尋找從一個特定資源加載媒體型的外延,正因爲如此,就是你應該尋找返回作爲一名開發人員。

Rails的respond_to格式是什麼讓你這樣做:

,說什麼,「如果客戶端響應這個 動作要HTML,不僅僅是應對,因爲我們將有前,但如果客戶希望 XML,返回它們的人以XML格式列表中。」(Rails的決定 從提交 客戶端HTTP Accept頭所需的響應格式。)

雖然啞劇被用於任何類型的「媒體」,Rails的範圍主要擴展到請求類型 - IE JS/JSON等,AJAX請求的content/type header中最常提到。


使用案例

在問候函數內是如何工作的,你需要明白,每次發送一個請求到應用程序的時間,這將是在格式化某種方式。

大多數請求都是標準HTML,但有時候會需要返回JSJSON請求。用例,這些可能是一個API的喜歡或asynchronous request

enter image description here

Ajax請求通過XMLJSON發送 - 這通常表示在控制器動作不同的方法。儘管並非總是如此,但它通常使您能夠根據您調用的請求類型定義特定的功能。

與此Rack:Request類處理控制器:

request.xhr? 

-

在問候如何這個工程在技術上,你會最好看answers in this question。我知道如果我向Rails發送JSON請求,我也可以在JSON中格式化回覆。

Rails採用MIME類型並做出相應響應。