2012-01-16 8 views
6

Czy istnieje sposób, aby zdefiniować globalnie aplikację szyn, aby wyświetlać tylko pliki json i xml i odpowiednio błąd w przypadku innych żądań?Ograniczanie szyn tylko do odpowiedzi na żądania JSON i XML

Wydaje mi się, że jest to coś podobnego do bloku before_filter i responses_to w ApplicationController, ale to jest tak daleko, jak moje dochodzenie.

Odpowiedz

10

Wystarczy zadeklarować go na poziomie klasy kontrolera, używając respond_to. Ma ono zastosowanie do wszystkich kontrolerów, jeśli robisz to na ApplicationController

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

także przeczytać o ActionController::Responder klasę więcej opcji.

+0

Myślałem, że ale muszę zrobić dodatkową pracę, aby wyrenderować błędy, jeśli inne wnioski zostały złożone? Zastanawiałam się też, czy szafka będzie lepszym miejscem do tego. – Nick

+0

Uderz w to - działa świetnie :) Wciąż się zastanawiam, czy stojak będzie lepszy. Czas na kopanie. – Nick

+1

To zrobiło dla mnie różnicę. Miało znaczenie tylko to, co odpowiadałem na rzeczy, które miałem w ramach działań kontrolera. –

1

Aby json odpowiedzi na błędy, po prostu dodaj następujący kod do 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

Dla każdego potykającego się o to, 'rescue_from ActionController :: RoutingError' nie działa już w Railsach> = 3.0. Zobacz https://github.com/rails/rails/issues/671 i [część 3 tego wpisu na blogu] (http://blog.plataformatec.com.br/2012/01/my-five-favorite-hidden- features-in-rails-3-2 /), aby uzyskać więcej informacji. – kibibyte

Powiązane problemy