2

アクティブなモデル(アクティブなレコードではない)とアクティブなリソースを持つクライアント側で動作するサーバーがあります。例えば、サーバ側コントローラの場合Rails:アクティブなリソース側(jsonシリアライザ)からエラーを取得できません。

... 
     def update 

     if @supplier.update_attributes(params[:supplier]) 
      respond_to do |format| 
       format.any { head :ok } 
      end 
     else 

      respond_with(@supplier.errors,:status => :unprocessable_entity) 
     end  
     end 
... 

ようなコードを持っているアクティブなモデルは次のコード

... 
    class Subscriber < BaseModel 
    include ActiveModel::Validations 
    include ActiveModel::Serialization 
    include ActiveModel::Callbacks 
    extend ActiveModel::Naming 
    validates :email, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i 
    def update_attributes(attributes={}) 
     self.attributes.merge!(attributes) 
     self.save 
     end 

     def save 
      if self.valid? 
      super 
      else 
      false 
      end  
     end 
... 

私は、クライアントアプリケーション

s = Supplier.find(13) 
s.email = '' 
s.save 

リターン偽のレールコンソールから次のコードを入力しています無効なメールのため

このエラーはrespond_with

#<ActiveModel::Errors:0x000001012e9d78 @base=#<Supplier:0x000001032bf8c8 @attributes={:id=>13, :company_name=>.......}, @validation_context=nil, @errors=#<ActiveModel::Errors:0x000001012e9d78 ...>>, @messages={:email=>["is invalid"]}> 

とクライアント(メッセージは空のハッシュである)私は、クライアント側でエラーを取ることができないのはなぜSの次の値

.... @remote_errors=#<ActiveResource::ResourceInvalid: Failed. Response code = 422. Response message = .>, @validation_context=nil, @errors=#<ActiveResource::Errors:0x000001034991d0 @base=#<Didww::Supplier:0x000001034af048 ...>, @messages={}>> 

を持って送信する前に、サーバーからのオブジェクトです?

UPD:応答の本体におけるクライアントGET {}は

"--- !ruby/object:Net::HTTPClientError \nbody: \"{}\"\nbody_exist: true\ncode: \"422\"\nheader: \n content-type: \n - application/json; charset=utf-8\n x-ua-compatible: \n - IE=Edge\n cache-control: \n - no-cache\n x-runtime: \n - \"0.128106\"\n content-length: \n - \"2\"\n server: \n - WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)\n date: \n - Thu, 29 Dec 2011 10:57:50 GMT\n connection: \n - close\n set-cookie: \n - _api_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRkkiJTM5OWQwNTZhMzI1MzcxYzdjZGI2NzNkZWZjNWE0OTQwBjsAVA%3D%3D--b9a0f65001dd994f269800f1c56259523ab669b1; path=/; HttpOnly\nhttp_version: \"1.1\"\nmessage: \"\"\nread: true\nsocket: \n" 

UPD2コントローラアクションは応答より

@supplier.update_attributes(params[:supplier]) 
respond_with(@supplier) 

次のように次

"--- !ruby/object:Net::HTTPClientError \nbody: \"{\\\"email\\\":[\\\"is invalid\\\"]}\"\nbody_exist: true\ncode: \"422\"\nheader: \n... 

見える見える場合私はインク問題が

class Errors < ActiveModel::Errors 

    # Grabs errors from a json response. 
    def from_json(json, save_cache = false) 
     array = Array.wrap(ActiveSupport::JSON.decode(json)['errors']) rescue [] 
     from_array array, save_cache 
    end 

クライアントは、サーバがエラーのハッシュ用のエラーキーを使用して期待し、クライアントとサーバのシリアル化のための異なる論理を使用することである({:エラー=> {:メール=>} [「無効です」]})が、サーバーdoes not !!(ちょっと{:電子メール=> ["is invalid"]})

私が見逃しているのは?

答えて

関連する問題