每当创建新用户时,用户都会应用一个角色。这通过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
答案 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