2013-02-12 7 views
11

乾杯!Ember.js ember-data restadapterがjsonをロードできない

TravelClient.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: DS.RESTAdapter.create({ bulkCommit: false, url: "http://someIP:somePORT"}) 
}); 

とルータ:

TravelClient.ToursRoute = Ember.Route.extend({ 
    model: function() { 
    return TravelClient.Tour.find(); 
    } 
}); 

私は、リモートサーバーからこのJSON受け取る:

{ 
    "tours": [ 
    { 
     "id": "5110e8b5a8fefe71e0000197", 
     "title": "qui deserunt dolores", 
     "description": "Id velit nihil.", 
     "seats": 12, 
     "options": [ 

     ], 
     "images": [ 
     { 
      "id": "5110e8b5a8fefe71e0000196", 
      "url": "url" 
     } 
} 

をしかし、私はreturn TravelClient.Tour.find()しようとすると、それはで失敗 私は燃えさしデータストアを持っています:

http://someIP:somePORT/tours 404 (Not Found) 

XMLHttpRequest cannot load http://someIP:somePORT/tours. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

それはRESTAdapterがわからない、それはJSONまたは何を受け取る必要がありますか?

UPDATE:レールのサーバー側のアプリケーションコントローラで

def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Request-Method'] = '*' 
end 

しかし、それはまだです:

OPTIONS http://someIP:somePORT/tours 404 (Not Found) 

そしてRESTAdapterがツアーをロードしようとするように見えますリソース、tours.json:

Request URL:http://someIP:somePORT/tours 

WORKING SOLUTION

RESTAdapter拡張:

TravelClient.CUSTOMAdapter = DS.RESTAdapter.extend({ 
    bulkCommit: false, 
    url: "http://remote_server_address",  
    buildURL: function(record, suffix) { 
    var s = this._super(record, suffix); 
    return s + ".json"; 
    } 
}) 

をしてOPTIONSへの応答

+0

設定したヘッダは、 'GET'で返されますが、' OPTIONS'要求 – albertjan

+0

ラックCORSの宝石とそれらを返す必要が要求おかげで、トリックをしました。私はOPTIONSリクエストを "そのまま"そのまま使っていると思います。 – xamenrax

+0

次の訪問者のためのリンクを作成しますhttps://github.com/cyu/rack-cors ftw – genkilabs

答えて

10

RESTAdapterは問題ではなく、ページとJSONではありませんJSONを期待右のヘッダーと要求同じドメインに存在しない場合、これはセキュリティ上の問題です。これを解決するには、下記の2つのソリューションのいずれかを使用します。

same origin policyに掲載されている場合は、JSONPまたはCORSのいずれかを使用する必要があります。最も速い修正は、おそらくember-dataにJSONPを使用することを伝えることです。サーバーは、ヘッダーとOPTIONS要求に応答する必要があるCORSについては

  • Access-Control-Allow-Origin
  • Access-Control-Request-Method

私はレールの専門家だが、あなたはおそらく何かをする必要があります。宝石とrack-corshereまたはhereを参照してください。あなたはとても似RESTAdapterajaxフックをオーバーライドしていることを行うことができ

App.store = DS.Store.create({ 
    revision: 11, 
    adapter: DS.RESTAdapter.create({ 
     namespace: "data", 
     url: "", 
     ajax: function (url, type, hash) { 
      hash.url = url; 
      hash.type = type; 
      hash.dataType = 'jsonp'; 
      hash.contentType = 'application/json; charset=utf-8'; 
      hash.context = this; 

      if (hash.data && type !== 'GET') { 
       hash.data = JSON.stringify(hash.data); 
      } 

      jQuery.ajax(hash); 
     }, 
    }) 
}); 
+0

CORSを使用するには、 'Access-Control-Allow-Origin:*'のようなsmthをサーバのレスポンスヘッダに追加するだけです。 – xamenrax

+0

はい参照:http://en.wikipedia.org/wiki/Cross-origin_resource_sharingここをクリック:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS他にもいくつかのヘッダーを制御できますより具体的には許可されるものである。 – albertjan

+0

更新を確認してください。 – xamenrax

1

私は(それは今のところ私のために働いている。)レールの周りの簡単な仕事を持っているように、それは、乱雑ですコントローラのロジックで簡単に締め付けることができます。 routes.rb

:単に任意のOPTIONS要求にステータスOKを返し

match ':path' => 'authentications#allow', constraints: {method: 'OPTIONS'} 

def allow 
    head :ok 
end 

そしてapplication_controller.rbにすべての要求のためのクロスオリジンリソース共有(CORS)ヘッダを設定します。

before_filter :cors 
def cors 
    response.headers.merge! 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Methods' => 'POST, PUT, GET, DELETE', 'Access-Control-Allow-Headers' => 'Origin, Accept, Content-Type' 
end 
+0

しかし、私のヘッダーには何も問題はありませんでした。私はjsonが必要な間に、Railsが私にHTMLを返すだけでした。だから回避策は、あなたがjson-extendアダプタのbuildURLメソッドを必要としていることを直接Railsに伝えることです。私の英語には申し訳ありません。 – xamenrax

1

あなたがJSONPを使用することを探しているなら、それは代わりにプライベートajaxOptions機能を無効にするためにはるかに簡単ですjQueryを使用し、ajaxメソッドをオーバーライドします。 Emberのパイプラインには、jQueryの依存関係の削除が含まれます。だからではなく、次の操作を行います。

adapters/application.jsを:

import DS from 'ember-data'; 

export default DS.RESTAdapter.extend({ 
    ajaxOptions: function(url, type, options) { 
     var hash = this._super(url, type, options); 
     hash.dataType = "jsonp"; 
     return hash; 
    } 
}); 

エンバーコアチームは、(代わりにプライベートAPIをハッキングの)正式にこれをサポートするためのパブリックメソッドを公開することができればそれが作成されます。

https://github.com/emberjs/data/blob/1.0.0-beta.15/packages/ember-data/lib/adapters/rest_adapter.js#L915

関連する問題