6

Rails db から emberjs + ember データを使用してデータをロードしようとすると、このエラーが発生します

キャッチされていない TypeError: 未定義のメソッド 'map' を呼び出せません

コフェスクリプトのコードは次のとおりです。

window.Cosmetics = Ember.Application.create

Cosmetics.store = DS.Store.create
  revision: 4
  adapter: DS.RESTAdapter.create 
    bulkCommit: false

Cosmetics.admin_user = DS.Model.extend({
  name: DS.attr('string')
  email: DS.attr('string')
});

Cosmetics.view = Ember.View.extend
  templateName: 'ember/views/aaa'

Cosmetics.admin_user.reopenClass
  url: 'admin/user'

Cosmetics.store.findAll(Cosmetics.admin_user)

コントローラーは適切な JSON データを取得します。インターネットで見つけた例からコードをマッピングしようとしましたが、何も役に立ちませんでした。何か案は?私は間違っていると思います。助けてくれてありがとう。

4

5 に答える 5

4

私はまったく同じ問題を抱えていました。私にとってそれを解決したのindexは、コントローラーのアクションで JSON をレンダリングするときにルート ノードを追加することでした。これは、次の行を変更することを意味しました。

format.json { render json: @things }

これに:

format.json { render json: { things: @things }}

これは、Ember-data では JSON オブジェクトにルート ノードが必要ですが、Rails にはデフォルトでルート ノードが含まれていないためです。

それが役立つことを願っています。

于 2012-05-28T20:08:17.947 に答える
4

問題が見つかりましたが、解決策がわかりません。

リソースが名前空間で提供されている場合、たとえば

App.Event = DS.Model.extend({
  name: DS.attr('string'),
});

App.Event.reopenClass({
  url: 'api/event'
})

ember-data が json 応答を解析するとjson[plural]findAllwhich should bejson['events']のような処理が行われますが、複数形は be と計算されるjson['api/events']ため、エラーが発生します。私は周りに尋ねて、おそらくこれについてチケットを上げます。

アップデート

ここでチケットを作成しました

回避策

ハックとして、私はこれをやっています:

def index
  respond_to do |format|
    format.json { render json: { 'api/events': Event.all } }
  end
end
于 2012-06-14T21:38:56.600 に答える
3

ember-data は、findAll の結果がモデルの複数形の下にネストされることを期待しています。

ember-data が期待しているもの:

{
    "users": [
        {
            "activated": null, 
            "created_at": "2012-05-14T19:35:44Z", 
            "email": "john@doe.com", 
            "id": 1, 
            "name": "john doe", 
            "updated_at": "2012-05-15T20:23:06Z"
        }
    ]
}

あなたの例で得ているもの:

[
    {
        "activated": null, 
        "created_at": "2012-05-14T19:35:44Z", 
        "email": "john@doe.com", 
        "id": 1, 
        "name": "john doe", 
        "updated_at": "2012-05-15T20:23:06Z"
    }
]

具体的には、エラーは、JSON 応答を取得し、「users」キーの下のすべてに対して「map」を実行することから発生します。この場合、このキーは存在しないため、「map」は「undefined」で呼び出されます。

于 2012-05-24T16:21:11.033 に答える
0

問題の根本的な原因はrest_adapter.jsの複数形関数であるため、解決策はそれを修正することです;)

  DS.RESTAdapter.reopenClass({
    pluralize: function(name) {
      if (!this.plurals[name])
        name = name.substring(name.lastIndexOf('/')+1);

      return this.plurals[name] || name + "s";
    }
  });
于 2012-07-09T15:01:51.780 に答える
0

私はついに解決策を見つけました!

これをこの方法で行うべきかどうかはわかりませんが、一括コミットを取り除くには十分でした。したがって、ストアは次のようになります。

Cosmetics.store = DS.Store.create
  revision: 4
  adapter: DS.RESTAdapter.create 

bulkCommit: falseUncaught TypeError: Cannot call method 'map' of undefinedエラーを引き起こしていました。

この問題は、Rails アプリで使用する場合、ember-data のみに関連しているようです。

問題を解決しているように見えたものが別の問題を引き起こしたので、私は少し急いだようです;|

于 2012-06-03T14:33:50.397 に答える