Rails,after_create被调用两次

时间:2016-10-27 19:54:41

标签: ruby-on-rails

每当创建新用户时,用户都会应用一个角色。这通过after_create方法发生。这是方法:

pop[, .(pop_count=.N), keyby=.(age_segment = toAgeGroups(age))][, age_segment_id := .I][]

但是,用户获得两次角色。创建之后,会发生这种情况:

def add_user_role
  self.roles << Role.find_by_role("user")
end

如果我注释掉add命令,则不会对用户应用任何角色:

=> #<ActiveRecord::Associations::CollectionProxy [#<Role id: 21, role: "user", created_at: "2016-10-27 15:13:44", updated_at: "2016-10-27 15:13:44">, #<Role id: 21, role: "user", created_at: "2016-10-27 15:13:44", updated_at: "2016-10-27 15:13:44">]>
irb(main):002:0> 

创作后:

def add_user_role
 # self.roles << Role.find_by_role("user")
end

有没有人知道,为什么会发生这种情况?

after_create方法位于User.rb:

=> #<ActiveRecord::Associations::CollectionProxy []>

我有两个用户控制器,它们是:

管理员的用户控制器:

class User < ApplicationRecord
  after_create :add_user_role
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :directions
  has_many :roles, through: :directions



end

private
def add_user_role
  self.roles << Role.find_by_role("user")
end

设计控制器:

class UsersController < ApplicationController
  before_action :authenticate_user!
  before_action :current_user_allowed?



    def edit
      @user = User.find(params[:id])
    end


    def update
      @user = User.find(params[:id])

      role = params[:role]
      add_user_role(@user,role)

      redirect_to root_path

    end
end

private

def current_user_allowed?
  current_user.roles.each do |role|
    if role.role == "superadmin"
      return
    end
  end
  redirect_to root_path
end

def add_user_role(user, role1)
  user.roles.create(role: role1)
end

def user_params
  params.require(:user).permit(:role)
end

2 个答案:

答案 0 :(得分:0)

就在这里你有两件事做同样的角色。

在users_controller中:

def add_user_role(user, role1)
  user.roles.create(role: role1)
end

然后在user.rb中:

after_create :add_user_role

我建议让控制器处理这个并避免在user.rb类中对模型进行任何修改。

答案 1 :(得分:0)

您的回调 after_create :add_user_role 必须在关联之后定义

# First: 
has_many :directions
has_many :roles, through: :directions

# Then:
after_create :add_user_role