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)
可能?另外,做同样事情的更好方法是什么?
一种简单的方法就是覆盖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)
单独保留标准路由并在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过滤器调用的方法。