簡體   English   中英

respond_to和respond_with如何在rails中工作?

[英]How does respond_to and respond_with work in rails?

什么時候有

def some_action
  respond_to do |format|
    format.html {}
    format.js {}
    format.json { respond_with @objects}
  end
end

看起來像html行和js行自動提供/調用匹配動作名稱的文件。 並且html和js提供一個或另一個,而不是兩者。 它是否正確?

如果你的js中有一個被調用的ajax調用,它會調用json,它會請求數據,這些需要數據來響應,對嗎? 我是否需要它來響應json和js,或只是一個?

如果你不回復,並省略所有類型,它默認是否響應html和js?

當我在控制器中執行respond_to而不是每個動作中的respond_to塊時,使用respond_with @objects適用於任何參數(:thml,:js,:xml,:json等)?

替代語法:

class TheController < ApplicationController

  respond_to :html, :js, :json, only: [:some_action, :other_action]

  def some_action
    respond_with @objects
  end
end

備用語法如何工作?

如果您使用備用語法,您是否可以對不同類型的請求做出不同的響應? 如果要以不同的方式響應,是否必須執行respond_to阻止而不是替代語法? 這些案例中的每一個如何解決html的優雅降級問題?

respond_with

對於給定的控制器動作,respond_with基於客戶端請求的mime類型生成適當的響應。

這基本上意味着您的控制器將根據請求發送相應的數據 - 例如,如果您執行了以下操作:

#app/controllers/articles_controller.rb
Class ArticlesController < ApplicationController
   def show
       @article = Article.find params[:id]
       respond_with @article
   end
end

每次發送請求時,這基本上都會響應來自@article的數據。 如果請求是在json mime-type中,它將作為JSON對象返回; 如果它是HTML請求,它將在show視圖中返回HTML對象

-

respond_to

基本上允許您定制對不同mime類型的特定響應。 如果發送JS請求,則可以管理JS響應等

respond_to控制器的動作里面塊是非常麻煩的,只有真正的意思的具體變化/編輯響應本身。

處理respond_to一種更簡單的方法是將它聲明在控制器文件的頂部,實質上告訴Rails每個操作都將使用該方法中定義的選項:

#app/controllers/your_controller.rb
Class YourController < ApplicationController
   respond_to :js, :json, :html #-> the same as using respond_to block for each action
end

請注意,在Rails 4中, respond_with功能已被提取到gem 'responders'https://github.com/plataformatec/responders )。

你需要/不需要每種format.*whatever*行。

通常,您不需要任何其中任何一個。 默認情況下,Rails會查找與控制器名稱匹配的視圖文件夾下的操作名稱匹配的html文件(也稱為模板)。

我不確定何時/為什么json和html有時會配對在一起(比如在腳手架生成的代碼中)。 也許json線用於turbolinks(請確認/更正此)。 但是我知道當你希望每種類型的行為不同時,你會使用帶有各種格式行的respond_to塊(例如,通過js一次提供10個結果,但通過html提供更多結果)。

在窗體或鏈接中使用remote: true時需要js格式。 這是因為使用此remote:true會禁用html模板的提供,而是查找與操作名稱匹配的js文件,並執行/呈現該文件。 如果你只在js中做事,你實際上並不需要響應json線。

額外提示:如果您的js文件有js.erb,您可以訪問您在操作中設置的實例變量(本地變量如何?請確認/更正)。 這種方式很有意義,因為*.js.erb文件在技術上是一個視圖。 視圖可以訪問其相應的動作變量(嗯什么時候從另一個控制器渲染vies?)。 因此,如果您已經可以訪問js文件中的操作變量,則可以在許多情況下無需進行ajax調用或json調用。

我實際上不確定何時需要json線時也使用remote: true / javascript。 需要json數據的顯式jQuery.ajax()方法調用可能保證使用對json行的響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM