コントローラー「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
私の知る限り、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を返します。
はい、変更できます
respond_to do |format|
format.html
format.json { render json: @user }
end
これを行う最善の方法は、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ブロックを使用してください。もっと読むことができます こちら 。