2012-02-03 7 views
25

私はRoA 3.0 WebアプリケーションをOAuth APIプロバイダとして使用しています。さて、APIでは、正しいHTTPエラーコードをAPIコンシューマに返したいと思います。これはどうすればいいですか?Ruby on Railsアプリケーションから正しいHTTPエラーコードを返す方法

def destroy_oauth 
    @item = Item.find(params[:id]) 
    if([email protected]? && @item.user_id == current_user.id) 
     @item.destroy 
     respond_to do |format| 
       format.js 
       format.xml 
     end 
    else 
     raise ActionController::RoutingError.new('Forbidden') 
    end 
end 

ので、エラーの場合には、私は禁断の403コードを返すようにしようとしている:ここで

は一例です。それでも、これを実行すると常に404 Not Foundが返されます。正しいコードを返すにはどうしたらいいですか?

これは何とかウェブサーバーで設定可能なものですか?

答えて

31

正しいステータスでページをレンダリングする必要があります。うまく

render(:file => File.join(Rails.root, 'public/403.html'), :status => 403, :layout => false) 
+0

OAuth API xmlレスポンスでもこれを行う必要がありますか? –

+2

ここでは、このような '.html'拡張子の指定は推奨されていません(https://github.com/rails/rails/issues/7288のディスカッションを参照)ので、' render(:file = > 403:、layout => false) '(フォーマットを指定した方法に注意してください)。 –

+0

...または 'render(:file => Rails.root.join( 'public'、 '403')、:formats => [:html]、:status => 403、:layout => false) 。 –

1

、デフォルトのRailsでは自身をレンダリングエラータイプの世話をする、

:status =>500 

を使用することができますが。

エラーデフォルトページはパブリックディレクトリにあります。 500.html、404.htmlなど。

For more information on :status , how to use it click here

+1

はい、おそらく、これらのステータスパラメータで遊ぶ必要があります。ありがとう! –

+0

これは本当です。しかし、私がレールでAPIを使っているのであれば、私は明示的にステータスコード – Kiong

42

あなただけのステータスコードを与えていると何も体が存在しない場合には、便利な方法は

head 403 

この方法でも受け付けていますこのよう

head :forbidden 
+0

を言及する必要があります。しようとします。 –

1

としてステータスコードのシンボリック名は、私はあなたがここに二つの問題があると思う:まず、あなたの@item = Item.find(params[:id])行は404を上げていると実行がwherに到達したことがないということですe意図(ifステートメント)。もう一つは、あなたが例外を上げており、決してそれらを捕まえていないということです。これらの線に沿って

def destroy_oauth 
    begin 
    @item = Item.find(params[:id]) 
    if([email protected]? && @item.user_id == current_user.id) 
     @item.destroy 
     respond_to do |format| 
      format.js 
      format.xml 
     end 
    else 
     raise ActionController::RoutingError.new('Forbidden') 
    end 
    rescue ActiveRecord::ResourceNotFound 
    redirect_to :action => 'not_found', :status => 404 # do whatever you want here 
    rescue ActionController::RoutingError 
    redirect_to :action => 'forbidden', :status => 403 # do whatever you want here 
    end 
end 

何かを、しかし、あなたはまた、あなたがAPIを構築していることを述べたので、あなたがエラーを救出しているとき、あなたはxmlエラー情報をレンダリングすることもできます。試してみてください。次のようなもの:

# in application_controller.rb 
rescue_from ActionController::RoutingError, :with => :render_forbidden_error 

private 

def render_forbidden_error(e) 
    render :status => e.status, :xml => e 
end 

幸運。ウダチ

10

ActionController::Head docsによると、単にアクション

return head([status]) if/unless [some condition here] 

をこのパターンを使用する例:

return head(:gone) if @record.deleted? 
    return head(:forbidden) unless @user.owns?(@record) 

returnは、アクションには、残りのコードが実行されないことを確認するために使用されています。

関連する問題