2013-01-05 66 views
2

我正在使用devise_invitable gem在我的应用程序中启用邀请以及设计为rails 3应用程序。我有一个User & Profile模型。在User中,有一个role列给出了用户的类型。现在devise_invitable:只允许管理员邀请用户

,我想限制创造新的邀请功能通过此作用域作用域航线管理员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 

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

回答

4

那么在Invitations控制器中仅使用标准路由并使用before_filter来检查管理员状态是否仅适用于新建和创建操作?

class Devise::InvitationsController < DeviseController 
    ... 
    before_filter :is_admin?, :only => [:new, :create] 
    ... 
end 

它看起来像devise_invitable宝石实际使用此方法在内部还有:

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在那里为新的和创建操作。当然,你还必须定义is_admin?过滤器调用的方法。

+0

我一直在寻找直接从路线做到这一点,但我想,我将不得不以这种方式工作。感谢您的回答 – CuriousMind

6

一个简单的方法是覆盖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 ::邀请者模块到你的用户模式:

class User < ActiveRecord::Base 
    ... 
    include DeviseInvitable::Inviter 
    ... 
end 
+0

感谢您的例子。这种方法(现在)在[devise_invitable自述文件](https://github.com/scambra/devise_invitable)中推荐。请参阅“控制器过滤器”部分。 –

+0

我喜欢这个例子,但是我认为如果你在你的模型中使用'devise'方法,则不需要包含Inviter模块。 – sealocal

相关问题