tutorial respond_to rails before_action ruby-on-rails ruby ruby-on-rails-4 respond-to

ruby on rails - respond_to - Rieles: responda a JSON y HTML



respond_to ruby (3)

Tengo un controlador "UserController" que debe responder a las peticiones normal y ajax a http://localhost:3000/user/3 .

Cuando es una solicitud normal, quiero mostrar mi vista. Cuando se trata de una solicitud AJAX, quiero devolver JSON.

El enfoque correcto parece ser un respond_to do |format| un respond_to do |format| bloquear. Escribir el JSON es fácil, pero ¿cómo puedo obtener que responda al HTML y simplemente renderizar la vista como de costumbre?

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


La mejor manera de hacerlo es como dijo Amitkumar Jha, pero si necesitas una forma simple y rápida de renderizar tus objetos, también puedes usar este "atajo":

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

O haz que respond_to funcione para todas las acciones en el controlador usando responder_con:

class UserController < ApplicationController respond_to :html, :json, :xml def index @users = User.all respond_with(@users) end end

A partir de la versión de Rails 4.2, necesitará usar el gem responder para poder usar responder_con.

Si necesita más control y desea poder tener algunas acciones que actúen de manera diferente, siempre use un bloque de respuesta completa. Puedes leer más here .


Sí, puedes cambiarlo a

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


Según mi conocimiento, no es necesario para "mostrar show" en formato.html buscará automáticamente una vista de acción respectiva para ex: show.html.erb para solicitud html y show, js, erb para solicitud JS.

entonces esto funcionará

respond_to do |format| format.html # show.html.erb format.json { render json: @user } end

también, puede verificar que la solicitud sea ajax o no, marcando request.xhr? devuelve true si request es ajax one.