2012-01-16 79 views
6

有沒有一種方法可以全局定義一個rails應用程序來只提供json和xml,並在其他任何請求上適當地出錯?限制只響應JSON和XML請求的導軌

我在想這是沿着ApplicationController中的before_filter和responds_to塊的東西,但就我的調查所得到的那樣。

回答

10

在控制器上的一流水平只是聲明它,使用respond_to。如果你這樣做對ApplicationController

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

也瞭解ActionController::Responder類更多的選擇將適用於所有的控制器。

+0

我認爲,但如果發出其他請求,我還需要做額外的工作來呈現錯誤嗎?我也想知道架子是否會是更好的選擇。 – Nick 2012-01-17 13:40:47

+0

罷工 - 工程很好:)還是不知道機架會更好。有時間挖掘。 – Nick 2012-01-17 14:08:33

+1

這對我來說沒有什麼不同。它只是重要的東西,我必須在我的控制器的行動。 – 2012-06-17 23:35:17

1

要做出錯誤的JSON響應,只是將下面的代碼添加到您的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

對於任何人在這方面磕磕絆絆,'rescue_from ActionController :: RoutingError'不再適用於Rails> = 3.0。請參閱https://github.com/rails/rails/issues/671和[本博文的第3部分](http://blog.plataformatec.com.br/2012/01/my-five-favorite-hidden- features-in-rails-3-2 /)瞭解更多信息。 – kibibyte 2013-01-06 09:08:33