

こんにちは。Meteor初心者です。  
meteor remove insecure した後で、サーバで判定した結果を、どうやって{{#IF}}に認識してもらうか、というところで行き詰っています。

【 やりたいこと 】  
{{#each}}を使って、データベースのカーソルをsubscribeするのではなく、  
{{#IF}}を使って、適当なテキストを、管理者のメールアドレスでログインした相手にだけ見せたいのですが、方法がわかりません。

【 症状 】  
後述のようなコードですが、サーバ側で管理者かどうかをチェックする部分は、きちんとtrue/falseを判定できています。しかし、クライアント側にその結果が戻されず、undefined
になってしまいます。

【 調べて考えたこと 】  
<http://docs.meteor.com/#/full/meteor_call>  
には、"On the client, if you do not pass a callback and you are not inside a
stub, call will return undefined, .." とあるので、まさに症状に合致します。それではということで
callbackで書くと、  
１．非同期なので、判定のタイミングが遅いと、{{#IF}}に反映されないおそれがある？  
２．callback関数で判定したtrue/falseの結果を、もとの{{#IF}}まで戻す方法がわからない。  
という問題を抱えています。２は最悪、グローバル変数かデータベースに保存すればいいのかとも思いますが・・

こうしたケースは、普通にありそうに思うのですが、何かスマートな方法をご存じないでしょうか。

【 コード 】

[code]

    ーclient.htmlーーーーーーーーーーーーーー
      <template name="showToAdmin">
        {{#if showToAdminText}}
          適当なテキスト
        {{/if}}
      </template>
    ーclient.jsーーーーーーーーーーーーーー
      Template.showToAdmin.helpers({
        'showToAdminText':function(){
          return Meteor.call('showToAdminText');
        }
      });
    ーserver.jsーーーーーーーーーーーーーー
      Meteor.methods({
        'showToAdminText':function() {
          var currentUserId = this.userId;
          if (currentUserId) {
            var address = Meteor.users.findOne(currentUserId).emails[0].address;
            return  (address == 'admin@gmail.com');
          }
          return false;
        }
      });
    
[/code]


CC BY-SA 3.0
2015-07-20T03:53:25.613
12493
2015-08-19T11:05:18.927
2015-08-19T11:05:18.927
10972
10536
question
meteor
Meteor で、{{＃IF}}を使って、セキュアな環境で、管理者だけが見られる情報を表示するには？


一応、ひとつの方法は考えて、実際に動きました。

IsAdminLoggingIn
のような、中身は何でもいいcollectionを作って、これを、管理者IDがログインしているときにサーバ側からsubscribeする（他のユーザIDならsubscribeしない）としておいて、クライアント側では、そのcollectionから値を取り出そうとしてundefined/true
を判断する、という方法です。

これで、当面はOKなのですが、少し大袈裟なので、何かもっとスマートな方法をご存じでしたら、示唆なりといただければありがたいです。


CC BY-SA 3.0
2015-07-20T09:09:18.427
12499
2015-07-20T09:09:18.427
10536
12493
answer