4

私はdevise_invitablegemを使用して、Rails 3アプリの工夫とともに、アプリで招待を有効にしています。UserProfileモデルがあります。Userには、ユーザーのタイプを示す列roleがあります。

ここで、このスコーピングルートをどこにスコーピングし、残りのルートをすべての人に公開することによって、管理者のみに新しい招待を作成する機能を制限したいと思います。このようなものdevise/invitations#newuser.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

簡単な方法の1つは、 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

彼らのReadmeによると:

コントローラの動作を変更するには、Devise::InvitationsControllerから継承するコントローラを作成します。使用可能なメソッドは、new、create、edit、およびupdateです。これらのアクションを編集する前に、元のコントローラーのソースを読む必要があります。

デフォルトのコントローラーをコピーして、独自のカスタムis_adminを追加してみますか?newアクションとcreateアクションのbefore_filterがあります。もちろん、is_adminも定義する必要がありますか?beforeフィルターが呼び出すメソッド。

于 2013-01-06T10:46:18.010 に答える