4

我正在使用devise_invitablegem 在我的应用程序中启用邀请以及为 rails 3 应用程序设计。我有一个User&Profile模型。在User中,有一role列给出了用户的类型。

现在,我想将创建新邀请的功能限制管理员范围内,方法是将这个范围界定路线限定到devise/invitations#newwhereuser.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

可能的?另外,做同样事情的更好方法是什么?

4

2 回答 2

8

一种简单的方法就是覆盖authenticate_inviter!ApplicationController中的方法如下:

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
于 2013-02-13T19:05:48.237 回答
6

不理会标准路由并在 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

根据他们的自述文件

要更改控制器的行为,请创建一个继承自 Devise::InvitationsController 的控制器。可用的方法有:新建、创建、编辑和更新。在编辑任何这些操作之前,您应该阅读原始控制器源代码。

我只是复制他们的默认控制器并尝试添加我自己的自定义 is_admin?before_filter 用于新建和创建操作。当然,您还必须定义 is_admin? 过滤器之前调用的方法。

于 2013-01-06T10:46:18.010 回答