2009-03-26 7 views
0

私はサービスへのアクティブなリソース呼び出しを行っています。カスタムエラーメッセージをフィードバックしたいと思います。通常のモデルバリデーションではないバリデーションがいくつかあるので、@ object.errorsを返すことはできません。activeresourceエラーステータスとレスポンスボディ

たとえば、私の検証の1つはこれです。 2つのオブジェクトには多対多の関係がありますが、他のオブジェクトとの関係の数が限られている(たとえば2つ)ように1つのオブジェクトを制限したいとします。クライアントで

::これは、顧客にユーザーを追加する要求を置く

response = Customer.find(customer_id).put(:add_user, :user_id => user_id) 

ここではいくつかのコードです。その後、サービスでこの追加が有効であることを確認したいと思います。

def add_user  
@user = User.find(params[:user_id]) 
@customer = Customer.find(params[:id]) 
if @customer.users.length > 2 
    render :xml => "ERR_only_2_users_allowed", :status => :unprocessable_entity 
end 
end 

これは私の問題です。アクティブリソースでは、戻り状況がエラーの場合、クライアント側は完全に失敗します。私はステータスを200に変更することができ、私はボディのエラーメッセージを正常に戻しますが、これはエラー応答コードを持つ目的を無効にするようです。

私は開始/救助ブロック

begin 
    response = Customer.find(customer_id).put(:add_user, :user_id => user_id) 
    rescue ActiveResource::ResourceInvalid => e 
    #return error code 
end 

で、クライアントからのリクエスト全体のコールを置くことができますが、私は422(unprocessable_entity)応答をキャッチしたときに、「私は後ろ身頃の何を取得、私はドン私のカスタムエラーメッセージを取得しないでください。 response = nil

どのように私は適切な応答コードでこれらのカスタムエラーメッセージを達成することができます知っていますか?

答えて

4

これは問題の可能性もありますが、どちらも非常に近いようです。私はカスタムのputメソッドを使用していますが、彼もあなたのために働くはずです。この処理を行うコードは次のとおりです。

rescue ResourceInvalid => error 
    errors.from_xml(error.response.body) 
end 

標準の保存方法でのみ動作します。他のメソッドが呼び出されたときにエラーを追加したい場合は、自分で行う必要があるように見えます。 古いコード:

def put(method_name, options = {}, body = '') 
    connection.put(custom_method_element_url(method_name, options), body, self.class.headers) 
end 

新しい私はここでactiveresource/libに/ active_resource/custom_methods.rb/ ベンダー/レールに

それを追加する必要がありました

はgitのから私のdiffは次のようになりますコード:

def put(method_name, options = {}, body = '') 
    begin 
    connection.put(custom_method_element_url(method_name, options), body, self.class.headers) 
    rescue ResourceInvalid => error 
    errors.from_xml(error.response.body) 
    end 
    self 
end 

したがって、422の例外がスローされたときにスタックトレースを調べて、どのメソッドが正確に呼び出されているかを確認します。それから、私が持っているもののようなものを加えてください。

なぜ、アクティブリソースの人々は、検証がそのsaveメソッドでのみ機能すると思うのか尋ねないでください。 saveメソッドは作成または更新を行いますが、 'putまたはpost'を呼び出すことはまったく同じことです、IMO。バリデーションを保存したい場合は、それらをputとpostで動作させたいと思います。とにかくそれにショットを付けます。

私は最後に自己が必要かどうかわかりません...私はそうではありません。私はちょうどそれを働かせる方法を考え出したので、私はこれで完全に終わったわけではありません。 Erik

0

あなたの問題は、XML文書ではなく単純な文字列である可能性があります。レンダーステートメントを次のように変更してみてください。

render :xml => { :error => "ERR_only_2_users_allowed" }, :status => :unprocessable_entity 
関連する問題