2016-04-21 55 views
1

據我所知,致電render將返回一個響應給瀏覽器。它可以返回不同類型的內容(html,json,js等)。然而,我對瀏覽器之後的功能有些困惑。Rails - 格式和渲染 - 它們是如何工作的?

如果響應爲html,則瀏覽器只呈現頁面。如果響應是json,通常,客戶端js代碼將採用json響應並對它做一些有用的操作。如果回覆是js,瀏覽器會做什麼?我不確定這個js是否被附加到文檔並執行?這與Rails UJS有關嗎?

另外,渲染與respond_to有什麼關係?他們並排使用,還是比另一種更受歡迎?

render html: 
render js: 
render json: 

respond_to |format| do 
    format.html 
    format.js 
    format.json 
end 

對不起,如果這看起來像很多問題,但我認爲這將有助於如果這些問題一起討論。

回答

0

如果回覆是js,瀏覽器會做什麼?

這完全取決於瀏覽器和用戶的javascript環境。你的應用程序返回js,瀏覽器會以它認爲最好的方式處理它。

我不確定這個js是否附加到文檔並執行?這與Rails UJS有關嗎?

UJS更關心的是確保即使用戶瀏覽器不處理JavaScript,應用程序也能正常工作。例如,您編寫腳本來攔截按鈕單擊事件並取消單擊操作,而不是執行其他操作,例如AJAX調用。 如果用戶禁用了javascript,則不會發生此攔截。因爲你已經用這種方式寫了js,所以會發生正常的按鈕點擊操作。這兩種情況都應該處理,兩者都應該工作 - 這是不引人注意的使用JavaScript。

至於追加到文件,不完全沒有。瀏覽器接收一堆代碼,如果可以的話,它會在當前文檔的上下文中運行該代碼。它不會隨後將代碼保存到任何地方,當它完成時它將被丟棄,並且文檔保留在腳本留下的任何狀態中。

render_relation_to怎麼樣?他們並排使用,還是比另一種更受歡迎?

respond_to允許您根據用戶如何提出請求來控制對用戶的響應方式。在上面的UJS的例子中,這允許你有一個響應HTML和AJAX請求的方法,但知道它們的區別,並且可以對響應做出任何改變。

例子:

respond_to |format| do 
    format.html # will by default render the view with this actions name 
    format.json do # lets pass back the object in json format 
    render @object.to_json 
    end 
end 

這些都旨在介紹和答案是非常簡單的,我進一步建議閱讀每個主題。

+0

我實際上是指rails/jquery-ujs和它附帶的魔法。 「至於追加到文檔中,並非完全沒有,瀏覽器接收到一堆代碼,並且如果可以的話,它會在當前文檔的上下文中運行該代碼。它不會隨後將代碼保存到任何地方,當它完成時它將被丟棄,並且文檔將保留在腳本留下的任何狀態中。「 - 我可以使用稍後在js響應中定義的函數嗎?您知道我可以在哪裏閱讀關於這個話題更多?(瀏覽器用js響應做什麼) – maru