devise_invitable:仅允许管理员邀请用户

Cur*_*ind 4 routes ruby-on-rails devise devise-invitable

我正在使用devise_invitablegem在我的应用程序中启用邀请以及设计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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*Yue 7

一种简单的方法就是覆盖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
Run Code Online (Sandbox Code Playgroud)

并在您的用户模型中包含DeviseInvitable :: Inviter模块:

class User < ActiveRecord::Base
  ...
  include DeviseInvitable::Inviter
  ...
end
Run Code Online (Sandbox Code Playgroud)


Kev*_*n P 6

单独保留标准路由并在Invitations控制器中使用before_filter来仅检查新操作和创建操作的管理员状态该怎么办?

class Devise::InvitationsController < DeviseController
    ...
    before_filter :is_admin?, :only => [:new, :create]
    ...
end
Run Code Online (Sandbox Code Playgroud)

看起来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
Run Code Online (Sandbox Code Playgroud)

根据他们的自述文件

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

我只是复制他们的默认控制器,然后尝试添加自己的自定义is_admin?在其中的before_filter用于new和create动作。当然,您还必须定义is_admin?before过滤器调用的方法。