web-dev-qa-db-ja.com

Rails:JSONおよびHTMLのrespond_to

コントローラー「UserController」を使用して、通常のリクエストに応答し、http://localhost:3000/user/3

通常のリクエストの場合、ビューをレンダリングしたいと思います。 AJAXリクエストの場合、JSONを返します。

正しいアプローチはrespond_to do |format|ブロック。 JSONの記述は簡単ですが、HTMLに応答し、通常どおりにビューをレンダリングするにはどうすればよいですか?

  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html {
        render :show ????this seems unnecessary. Can it be eliminated??? 
      }
      format.json { 
        render json: @user
      }
    end
  end
41
Don P

私の知る限り、format.htmlで「表示」する必要はないため、exのそれぞれのアクションビューを自動的に検索します。htmlリクエストの場合はshow.html.erb、JSリクエストの場合はshow、js、erbです。

だからこれはうまくいく

respond_to do |format|

  format.html # show.html.erb
  format.json { render json: @user }

 end

また、request.xhrをチェックすることで、リクエストがajaxかどうかを確認できますか?リクエストがajaxの場合はtrueを返します。

78
Amitkumar Jha

はい、変更できます

respond_to do |format|
  format.html
  format.json { render json: @user }
end
18
Santhosh

これを行う最善の方法は、Amitkumar Jhaが言ったのと同じですが、オブジェクトをレンダリングするためのシンプルで迅速な方法が必要な場合は、この「ショートカット」を使用することもできます。

def index
  @users = User.all
  respond_to :html, :json, :xml
end

または、respond_to respond_withを使用して、コントローラー内のすべてのアクションを処理します。

class UserController < ApplicationController
  respond_to :html, :json, :xml

  def index
    @users = User.all
    respond_with(@users)
  end
end

Rails 4.2バージョンから開始するには、gem responder respond_withを使用できるようにします。

より多くの制御が必要で、異なる動作をするいくつかのアクションが必要な場合は、常に完全なrespond_toブロックを使用してください。もっと読むことができます こちら

0
Nesha Zoric