2013-01-05 64 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

相關問題