Ruby on rails AngularJS:与多个模型一起使用Desive
我有一个rails应用程序,使用Desive,有两个不同的模型,对应着完全不同的角色(没有STI-完全不同的模型) 我打算搬到前端的AngularJS。想知道构建应用程序的最佳方式是什么 以下是我的初步想法:Ruby on rails AngularJS:与多个模型一起使用Desive,ruby-on-rails,angularjs,ruby-on-rails-4,devise,Ruby On Rails,Angularjs,Ruby On Rails 4,Devise,我有一个rails应用程序,使用Desive,有两个不同的模型,对应着完全不同的角色(没有STI-完全不同的模型) 我打算搬到前端的AngularJS。想知道构建应用程序的最佳方式是什么 以下是我的初步想法: 每个用户模型都有不同的基本登录页面(domain.com/user和domain.com/company) 在呈现该页面之前,我使用Desive检查是否已登录正确的角色,如果没有,则重定向到相应的登录页面(服务器端重定向) 所有未登录的页面都是非角度的,以便有效地执行此操作 已登录的页面都
编辑:理想情况下,我希望能够尽可能多地使用Desive的功能。我建议您重新思考您的问题,假装Desive和angular彼此无关 假设您不打算在rails中呈现任何html模板。您只需要使用rails创建一个json api,应用程序的接口将是一个单页应用程序。UI路由都将在angular应用程序中完成
devise_for :normal_users
devise_for :admin_users
# route for the sample controller below
resource :users do
collection do
get :current
end
end
什么样的设计能带来成功
Desive将在控制器中创建以下内容:
current_normal_user
authenticate_normal_user!
current_admin_user
authenticate_admin_user!
因此,您必须检查这两个检查以查看会话是否已通过身份验证,最好的计划是在\u操作之前将这两个检查包装成自定义的,类似于\u操作之前的:对所有用户进行身份验证
用户控制器示例
下面是一个示例UsersController
,它返回用于检查身份验证的JSON
class UsersController < ApplicationController
# Needs a before_action that authenticates the user
respond_to :json
def current
@user = current_normal_user || current_admin_user
respond_with @user
end
end
在您的场景中,您可能需要添加逻辑来确定他们应该看到哪个登录页面,普通用户还是管理员用户
用户信息
最后是一个获取用户信息的示例Angular service。如果用户未通过身份验证,则先前的$httpProvider
将捕获401状态,并相应地处理该用户。否则,如果用户经过身份验证,则用户信息将填充到$rootScope.currentUser
。您只需将其作为依赖项添加到应该受身份验证保护的控制器中。(用咖啡脚本)
此服务依赖于指向/users/current.json
端点的CurrentUser
资源。在使用CurrentUserService的场景中,处理多个模型的可能选项有:
- 检查两次用户是否经过身份验证,一次是普通用户,另一次是管理员用户
- 创建一个自定义控制器方法来检查普通用户和管理员用户的身份验证,这大致就是示例rails控制器所做的
额外学分
或者,我会研究一种允许会话在Angular内过期的方法
根据评论更新
当后端请求用户信息为hap时,我的登录页面开始显示
angular.module("TheAngularApp.services").service "CurrentUserService", ($rootScope, $http, CurrentUser, User) ->
userService =
reloadCurrentUser: ->
@currentUser = CurrentUser.show((user) ->
# set in scope
$rootScope.currentUser = user
)
@currentUser
userService.reloadCurrentUser()
userService
Session.create {email: email, password: password}, success = (user) ->
# User was successfully authenticated
$scope.currentUser = user
$location.path( "/" );
, error = (data, status, headers, config) ->
# Failed to auth, notify user
)