我不得不添加一些控制器代码来完成这项工作,我希望这会有所帮助:
请记住允许您在 active_admin 中接受的属性(这将创建permitted_params 方法,我稍后会提到。
请注意,由于我们没有将 role_ids 直接保存给用户,因此它甚至不必是允许的参数。
permit_params :email, :password, :etc
创建一个我们可以从创建和更新控制器调用的私有方法。此方法只会遍历非空 id,找到关联的角色,并将它们添加到 user.roles。
create 和 update 方法只是在继续执行之前调用add_roles 方法。 ActiveAdmin 通过resource 使现有用户可用,但不能通过create。我们必须自己在创造中找到它!
controller do
def create
@user = User.new(permitted_params[:user])
add_roles(@user)
create!
end
def update
add_roles(resource)
update!
end
private
def add_roles(resource)
resource.roles = []
params[:user][:role_ids].each { |r| resource.roles.push(Role.find(r)) unless r.blank? }
end
end
在activeadmin表单中,可以添加:
form do |f|
# other inputs
f.input :roles, as: :select, multiple: true, collection: Role.all
end
并且在显示页面中,您可以这样显示角色:
show do
attributes_table do
# other rows
row :roles do |r|
r.roles.map { |role| role.name }.join(", ")
end
end
希望这会有所帮助!