在模型创建时设计update_attribute

时间:2017-08-08 18:59:13

标签: ruby-on-rails devise

我有一个使用案例的应用程序:有人可以注册为管理员帐户。该管理员可以邀请其他用户。

我有一个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,因为它只能访问视图,帮助器和控制器。

2 个答案:

答案 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为零,则会抛出错误!