0

如果我进行手动页面刷新或像这样设置重定向

}).then(function() {
  document.location = "/";
}, function() {

在我的 Ember 应用程序的一个函数中,一个 Ember 控制器属性变得未设置。我不确定哪个属性变得未设置是否重要,但如果确实如此,这里是代码。在我的应用程序模板中,我检查用户是否经过身份验证

    {{#if isAuthenticated}}
         blah blah
    {{else}}
        blah blah
    {{/if}}

该属性在 AuthController 中设置

App.AuthController = Ember.ObjectController.extend({
    currentUser: null,
    isAuthenticated: Em.computed.notEmpty("currentUser.email"),
    login: function(route) {
      var me;
      me = this;
      return $.ajax({
        url: "/users/sign_in.json",
        type: "POST",
        data: {
          "user[email]": route.currentModel.email,
          "user[password]": route.currentModel.password
        },
        success: function(data) {

          me.set('currentUser', data.user);

因此,在我刷新页面后,我的 currentUser (根据 Ember)不再显示为已通过身份验证。但是,在(Ruby on Rails)服务器端,用户仍然是经过身份验证的。我将此代码放在布局中进行检查,在 Ember 认为我已注销(页面刷新)之后,我的服务器代码仍然告诉我我已登录(实际上我是)。

    <% if current_user %>
    there is a current user
    <% end %>

你能解释为什么会发生这种情况吗?

4

2 回答 2

2

您最好的设置可能是创建isAuthenticated一个计算属性,该属性执行 ajax GET/users/currentifcurrentUser为 null。/users/current如果用户未通过身份验证,则应返回{},如果是,则返回当前用户数据。

App.AuthController = Ember.ObjectController.extend({
  currentUser: null,
  isAuthenticated: function() {
    var currentUser = this.get('currentUser');
    if(Ember.isEmpty(currentUser)) {
      $.ajax({
        type: "GET",
        url: "/users/current.json",
        async: true
      }).done( function( data ) {
        me.set('currentUser', data.user);
      });
      return false;
    } else {
      return true;
    }
  }.property('currentUser'),

});
于 2013-10-01T08:47:05.193 回答
1

你为什么要刷新手册页?这样您就完全从头开始启动浏览器,因此 Ember 应用程序再次初始化,因此属性 currentUser 未在您的控制器上设置。

而不是这样做:

}).then(function() {
  document.location = "/";
}, function() {

我假设你想去你的应用程序的起始页(因为你想去“/”)。相反,您应该使用 Ember 在路由之间转换的功能。我不知道你在哪里执行上面的代码,但你可以从你的一个控制器或路由中执行此操作。

在控制器中,您可以使用transitionToRoute

// index is a Route which is implicitly generated by Ember for you
this.transitionToRoute('index');

在路由器中,您可以使用transitionTo

this.transitionTo('index');
于 2013-10-01T08:12:36.683 回答