如何在没有页面刷新的情况下使用AngularJs在rails上获取更新的会话数据

时间:2015-05-26 09:49:47

标签: ruby-on-rails ruby angularjs

我目前正致力于将devise作为身份验证后端进行集成,并将angular作为其前端。

我在登录和退出时遇到问题,会话数据会更新,直到页面刷新。

我将做什么来获取没有页面刷新的会话数据..?

感谢您的回答...

AngularJs控制器:

function UsersCtrl($scope, Session) {"use strict";

$scope.CurrentUser = Session.requestCurrentUser();

$scope.login = function(user) {
    $scope.authError = null;

    Session.login(user.email, user.password)
    .then(function(response) {
        if (!response) {
            $scope.authError = 'Credentials are not valid';
        } else {
            $scope.authError = 'Success!';
        }
    }, function(response) {
        $scope.authError = 'Server offline, please try later';
    });
};

$scope.logout = function() {
   // alert("woow");
    Session.logout();
};

$scope.register = function(user) {
    $scope.authError = null;
    console.log(user);
    Session.register(user.email, user.password, user.confirm_password)
        .then(function(response) {

        }, function(response) {
            var errors = '';
            $.each(response.data.errors, function(index, value) {
                errors += index.substr(0,1).toUpperCase()+index.substr(1) + ' ' + value + ''
            });
            $scope.authError = errors;
        });
};
}

AngularJs会话服务:

 angular.module('sessionService', ['ngResource'])
 .factory('Session', function($location, $http, $q) {
    // Redirect to the given url (defaults to '/')
    function redirect(url) {
        url = url || '/';
        $location.path(url);
    }
    var service = {
        login: function(email, password) {

            return $http.post('/users/login', {user: {email: email, password: password} })
                .then(function(response) {
                    service.currentUser = response.data.user;

                    if (service.isAuthenticated()) {                            
                        //$location.path(response.data.redirect);
                        $location.path('/store');
                    }
                });

        },

        logout: function() {
            $http.delete('/sessions').then(function(response) {
                $http.defaults.headers.common['X-CSRF-Token'] = response.data.csrfToken;
                service.currentUser = null;
                redirect('/store');
            });
        },

        register: function(email, password, confirm_password) {
            return $http.post('/users', {user: {email: email, password: password, password_confirmation: confirm_password} })
            .then(function(response) {                    
                service.currentUser = response.data;

                if (service.isAuthenticated()) {
                    console.log("authenticated");
                    $location.path('/');
                }
            });
        },
        requestCurrentUser: function() {
            if (service.isAuthenticated()) {
                return $q.when(service.currentUser);
            } else {
                return $http.get('/users').then(function(response) {
                    service.currentUser = response.data.user;
                    return service.currentUser;
                });
            }
        },

        currentUser: null,

        isAuthenticated: function(){
            return !!service.currentUser;
        }
    };
    return service;
    console.log(service);
});

3 个答案:

答案 0 :(得分:0)

关于构建这样的应用程序(restful)的一件事就是将后端理解为api和应用程序作为前端非常好。

然后考虑一个故事;

在您应用的登录屏幕中

前端:您向后端提供了凭据;

后端:检查并验证然后它将创建一个存储在db中的唯一哈希(建议JWT检查前端到期时间)到您的前端。

前端:将其保存在cookie中。 也可以将它放在你的ajax设置标题部分中作为"授权:{token}"

前端:然后将带有此标题的每个请求发送到您的后端。

后端:始终检查令牌是否存在且有效以提供资源。

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/此链接帮助我了解过去的所有事情和误解。

答案 1 :(得分:0)

使用$ window.location.reload();在页面重定向之前。

答案 2 :(得分:0)

实现此目的的一种方法可能是覆盖设计sessions_controller销毁操作,然后执行sign_out @current_user将会话作为json返回