我有一个使用案例的应用程序:有人可以注册为管理员帐户。该管理员可以邀请其他用户。
我有一个User
模型,其列admin
默认为false。我使用devise_invitable
gem来处理邀请。当有人注册时,admin列应为true。当管理员邀请用户时,gem会创建一个具有admin =>的用户false,因此是普通用户,无权邀请其他用户。
我是通过覆盖设计控制器来做到这一点的:
#registrations_controller.rb
def create
super
current_user.update_attribute :admin, true
end
现在我想将此行为传递给模型(Fat模型,瘦模控制器)但我不能在模型中使用current_user
,因为它只能访问视图,帮助器和控制器。
答案 0 :(得分:1)
模型无权访问current_user
等辅助方法。据我所知,after_create
User
上的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
,这实际上会破坏保持控制器精益的目的,并且如果你可能会引入错误我并不确切知道该方法是如何运作的。
如果你想&#34;瘦身&#34;控制器,我认为最好的办法就是把它提炼成一个问题。
在RegistrationsController
class Users::RegistrationsController < Devise::RegistrationsController
include AdminCreatable
end
在{{1}}
中{{1}}
答案 1 :(得分: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
为零,则会抛出错误!