2017-08-08 80 views
-1

我有一个应用程序的用例是:有人可以注册一个帐户作为管理员。该管理员可以邀请其他用户。从模型创建时设计update_attribute

我有一个User模型,列admin默认为false。我使用devise_invitable宝石来处理邀请。当有人注册时,管理员栏应该是真实的。当管理员邀请用户时,该gem会创建一个admin => false的用户,因此是普通用户,并且没有邀请其他用户的权限。

我这样做是通过重写色器件的控制器,就像这样:

#registrations_controller.rb 
def create 
super 
current_user.update_attribute :admin, true 
end 

现在我想这种行为传递给模型(高脂模型,瘦控制器),但我不能在模型中使用current_user其只有意见,帮手和控制者才能访问。

+0

你是什么意思'当有人使用登记的module'? –

+0

当某人注册时 – Dotol

+0

当某人注册时创建了“用户”。为什么不把'admin'设置为默认为'true'? –

回答

1

模型无权查看帮助方法,如current_user。据我所知,在User上的after_create回拨将不起作用,因为User不知道,也不关心它是否由注册或邀请创建。你可以定义一个新User.create_as_admin方法

class User < ApplicationRecord 
    def self.create_as_admin(params = {}) 
    params.merge(admin: true) 
    create(params) 
    end 
end 

但这需要覆盖更多的RegistrationsController#create动作的使用User.create_as_admin代替User.create,这将真正打败保持控制器瘦的目的,如果你不能够引入错误不知道该方法的工作原理。

如果你想“瘦”控制器,我认为要做的最好的事情是解压缩到一个问题。

app/controllers/concerns/admin_creatable.rb

module AdminCreatable 
    extend ActiveSupport::Concern 

    included do 
    after_action :update_user_as_admin, only: :create 
    end 

    def update_user_as_admin 
    current_user.update admin: true 
    end 
end 

在你RegistrationsController

class Users::RegistrationsController < Devise::RegistrationsController 
    include AdminCreatable 
end 
+1

美丽,谢谢! – Dotol

0

你可以一个方法添加到模型,使用户的管理:

class User < ApplicationRecord 
    # model 
    ... 
    def make_admin! 
    update(admin: true) 
    end 
end 

class RegistrationsController < ApplicationController 
    def create 
    ... 
    current_user.make_admin! 
    end 
end 

请注意,这将抛出一个错误,如果current_user是零!