2012-01-16 6 views
6

¿Existe alguna manera de definir globalmente una aplicación de rieles para que solo sirva json y xml y el error correspondiente en cualquier otra solicitud?Limitación de raíles para responder solo a solicitudes JSON y XML

Estoy pensando que es algo similar a un before_filter y responde_ a un bloqueo en ApplicationController, pero eso es lo que mi investigación me ha descubierto.

Respuesta

10

Sólo se declaran a nivel de clase en el controlador, usando respond_to. Se aplicará a todos los controladores si lo hace en ApplicationController

class ApplicationController < ActionController::Base 
    respond_to :xml, :json 
    … 
end 

también leer sobre ActionController::Responder clase para más opciones.

+0

Pensé eso, pero ¿tendría que hacer un trabajo adicional para generar errores si se realizaran otras solicitudes? También me pregunté si rack sería un mejor lugar para esto. – Nick

+0

Huelga que funciona muy bien :) Todavía me pregunto si el estante sería mejor. Tiempo para cavar – Nick

+1

Esto hizo cero diferencia para mí. Solo importaba qué responder a las cosas que tenía que hacer en las acciones de mi controlador. –

1

Para que la respuesta JSON en los errores, sólo tiene que añadir el siguiente código a su application_controller:

rescue_from Exception, :with => :render_error 
rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found 
rescue_from ActionController::RoutingError, :with => :render_not_found 
rescue_from ActionController::UnknownController, :with => :render_not_found 
rescue_from ActionController::UnknownAction, :with => :render_not_found 

private 

def render_not_found(exception) 
    # logger.info(exception) # for logging 
    respond_to do |format| 
    render json: {:error => "404"}, status: 404 
    end  
end 

def render_error(exception) 
    # logger.info(exception) # for logging 
    respond_to do |format| 
    render json: {:error => "500"}, status: 500 
    end 
end 

public 

def some_public_func 
#do sthg 
end 
+0

Para cualquier persona que tropiece con esto, 'rescue_from ActionController :: RoutingError' ya no funciona en Rails> = 3.0. Consulte https://github.com/rails/rails/issues/671 y [parte 3 de esta publicación de blog] (http://blog.plataformatec.com.br/2012/01/my-five-favorite-hidden- features-in-rails-3-2 /) para más información. – kibibyte

Cuestiones relacionadas