1

我正在尝试使用 Backbone 使用 Devise(Rails 的身份验证 gem)实现身份验证。用户可以通过发送 DELETE 请求来退出 Backbone,/users/sign_out/所以我无法让这个链接工作,因为如果我点击它,它就是一个 GET 请求

<li><a href="/users/sign_out" class="thumbnail plain">sign out</a></li>

然后我在用户模型上创建了一个注销方法,但要触发它,我必须有一个用户模型的实例(显然)。我在路由器中创建了一个注销方法,该方法通过导航到路由来触发logout,但由于我只能logout使用它的实例调用用户模型,所以我在注销方法中创建一个新模型只是为了调用注销。

    "logout": "logout"

    },

    logout: function(){
     var foo = new app.Models.User
     foo.logout();

    }

这显然是一个坏主意,但我不知道还能做什么。你能推荐我应该做什么吗?有没有办法让注销成为一个类方法,这样我就不必为了注销或其他什么而实例化一个新模型?

更新

这是 User 模型中的 createUser 方法,它将注册数据发送给设计。在成功回调中,它将会话分配给一个变量window.app.current_user = userSession;。我在用户模型上也有一个注销方法,我尝试像这样从路由器调用

在路由器中注销

logout: function(){  
    window.app.current_user.logout();
    }

--

app.Models.User = Backbone.Model.extend({
      initialize:function () {       

    }, 
    createUser: function() {
    var user = {};
    user['email'] = this.get("email");
    user['password'] = this.get("password");
    user['password_confirmation'] = this.get("password_confirmation");
    var registration = {};
    registration['user'] = user; 
  var _this = this;
  $.ajax({
    url: '/users.json',
    type: "POST",
    data: {user: user, registration: registration},
    success: function(userSession, response) {

      window.app.current_user = userSession;

    },

   ... code ommitted

logout: function(){
  var me;
  console.log("Logging out...");
  me = this;
  return $.ajax({
    url: '/users/sign_out',
    type: "DELETE",
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
       window.app.current_user = '';

    },
    error: function(jqXHR, textStatus, errorThrown) {
      return alert("Error logging out: " + errorThrown);
    }
  });

}, 
4

1 回答 1

2

我有点困惑,为什么在尚未创建 User 模型时要触发注销功能。您能否解释一下您在路由器中设置此注销功能的原因?

就个人而言,我会有一个 Session 模型来监听链接的点击事件。然后这将调用一个注销方法,该方法将发出 DELETE 请求。

更新

这是一个快速的 JsFiddle,它显示了创建模型并将其附加到全局变量:http: //jsfiddle.net/Francium123/eBG3E/2/

    var User = Backbone.Model.extend({
     initialize:function () {       
        this.name = "MyName";
        this.password = "password"
    }, 

    login:function(){
        console.log("login called");
    },

logout: function(){
      console.log("logout called");
    }
});

window.MyModels = window.MyModels || {}; 
window.MyModels.User = new User();

console.log(window.MyModels.User.login());
console.log(window.MyModels.User.logout());

请注意,这只是一个示例,我怀疑您是否希望将密码存储在模型中!

此外,您应该能够使用 Backbone 模型的 fetch(GET)、save(POST/PUT)、destroy(DELETE) 方法,而不是直接在模型中编写 ajax 请求。如果需要,您可以覆盖模型同步方法。

于 2013-09-16T21:47:16.500 回答