2016-11-25 4 views
0

私のアプリケーションルートでは、現在のセッションとユーザーを取得します。emberの属性によるレコードの取得

/routes/application.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 

    beforeModel: function() { 
     return this.get('session').fetch().catch(function() {}); 
    }, 
    model() { 
     return this.store.findRecord('user', this.get('session.currentUser.uid')); 
    } 
}); 

私のモデルはそのように設定されています

/models/bet.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    created: DS.attr('date'), 
    user: DS.belongsTo('user', { async: false }) 
}); 

/モデル/ user.js

私の/ベットルートで210
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    email: DS.attr('string'), 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    bets: DS.hasMany('bet', { async: true }) 
}); 

私はuser == session.currentUser.uidまたは類似の方法は、現在のユーザーをbelongToのみbetsを取得する唯一の賭けをロードしたいと思います。

私は結果なしでこれを行うための最善の方法を見つけることを試みました。

+0

私はあなたの問題はここにある正確にはよく分からないが、ヨーヨーを持っていますセッションサービスを登録しようとしましたか? 'beforeModel'コールの前に' session:Ember.inject.service() 'を実行しました – Beno

答えて

1

ニアベのアプローチは、すべての賭けをあなたが望むものだけにフィルターすることです。 APIベースのソリューションは、1)サーバへのリクエストでクエリパラメータを使用する、2)/users/2/betsのようなネストされたURLを使用することができます。どちらの場合でも、これをサーバーに実装する必要があります。

例1)フィルター

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    return this.store.findAll('bet').then((bets) => { 
     const currentUserId = this.get('session.currentUser.uid') 
     return bets.filter((bet) => { 
     return bet.get('user.id') === currentUserId 
     }) 
    }); 
    } 
}); 

例2)クエリ。あなたのサーバはres304を受け取らなければならないでしょう

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    return this.store.query('bet', { 
     userId: this.get('session.currentUser.uid') 
    }) 
    } 
}); 

例3)ネストされた属性。 これを行うためには、あなたが2つのことが必要です。

  1. ユーザーは、このようなlinks属性が付属しています:あなたのサーバーは、する必要があります
  2. `{ベット:「UID /賭けAPI /ユーザーを/」}要求/api/users/:uid/betsに対応し、ユーザーのためにのみ賭け金を返すことができ

コード:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    const currentUser this.store.peekRecord('user', this.get('session.currentUser.uid')) 
    return currentUser.get('bets') // sends request to `api/users/:uid/bets` 
    } 
}); 
+0

私は実際に2番目のソリューションと同様の方法でこれを解決しました。私はFirebaseを使用しており、クエリの動作が多少異なっていることを認識していませんでした。私は 'beforeModel'でも何もしません。 'model(){ var user = this.get( 'session.currentUser.uid');this.store.query( 'bet'、{orderBy: 'user'、equalTo:user})を返します。 } ' – Lehar001

0

Ember Simple Authをお使いですか?そうであれば、あなたの要求は、提供された情報に基づいて現在のユーザをフェッチするために使用できるトークンを送信しています。現在のユーザーのベットだけを返すのはデフォルトの動作なので、ロジックをAPI側に保つことは良い考えです。他のタイプのフィルタは、queryまたはqueryRecordメソッドで行う必要があります。

関連する問題