我正在使用devise_invitable
gem在我的应用中启用邀请以及设计rails 3应用。我有User
& Profile
模型。在User
中,有一个role
列,它提供了用户类型。
现在,我想通过将此范围界定范围限定为devise/invitations#new
user.role=='admin'
&来限制创建新邀请仅的功能。打开其他人的路线。像这样的东西
MyApp::Application.routes.draw do
devise_for :users, skip: [:registrations, :invitations]
as :user do
get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
put 'users' => 'devise/registrations#update', as: 'user_registration'
# manually define alll devise_invitable routes, except devise/invitations#new
# accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit
# user_invitation POST /users/invitation(.:format) devise/invitations#create
# also the #accept route goes here
end
resource :profile, except: :destroy
authenticated :user, lambda {|u| u.role == "admin"} do
resources :user, controller: "user"
#only allow admin to invite other users
# new_user_invitation GET /users/invitation/new(.:format) devise/invitations#new
end
root to: 'profiles#show'
end
可能?另外,做同样事情的更好方法是什么?
答案 0 :(得分:6)
一种简单的方法就是覆盖 ApplicationController 一侧的 authenticate_inviter!方法,如下所示:
class ApplicationController < ActionController::Base
...
private
def authenticate_inviter!
unless user.role=='admin'
redirect_to root_url, :alert => "Access Denied"
end
super
end
...
end
将DeviseInvitable :: Inviter模块包含在您的用户模型中:
class User < ActiveRecord::Base
...
include DeviseInvitable::Inviter
...
end
答案 1 :(得分:5)
如果单独留下标准路线并在Invitations控制器中使用 before_filter 来检查新的和创建操作的管理状态呢?
class Devise::InvitationsController < DeviseController
...
before_filter :is_admin?, :only => [:new, :create]
...
end
看起来devise_invitable gem实际上也在内部使用了这个方法:
class Devise::InvitationsController < DeviseController
before_filter :authenticate_inviter!, :only => [:new, :create]
before_filter :has_invitations_left?, :only => [:create]
before_filter :require_no_authentication, :only => [:edit, :update]
...
end
根据他们的Readme:
要更改控制器的行为,创建一个继承自Devise :: InvitationsController 的控制器。可用的方法有:新建,创建,编辑和更新。在编辑任何这些操作之前,您应该阅读original controllers source。
我只是复制他们的默认控制器并尝试添加我自己的自定义is_admin? before_filter在那里进行new和create操作。当然你还需要定义is_admin?过滤器调用之前的方法。