使用 Rails 4.0、ActiveAdmin、Rolify 和 CanCan,通过 activeadmin 面板添加和删除用户角色不会保存(提交到数据库)。
我的ActiveAdmin 用户和用户模型看起来不错,因为我可以使用复选框列出适用于用户的所有角色。尽管通过复选框添加任何角色或删除任何角色时,更改不会被应用。
我收到用户已成功更新的通知,但当我查看数据库或呈现页面时,角色尚未更新。
保存表单后如何更新角色?
编辑:
也使用设计。
使用 Rails 4.0、ActiveAdmin、Rolify 和 CanCan,通过 activeadmin 面板添加和删除用户角色不会保存(提交到数据库)。
我的ActiveAdmin 用户和用户模型看起来不错,因为我可以使用复选框列出适用于用户的所有角色。尽管通过复选框添加任何角色或删除任何角色时,更改不会被应用。
我收到用户已成功更新的通知,但当我查看数据库或呈现页面时,角色尚未更新。
保存表单后如何更新角色?
编辑:
也使用设计。
这里的解决方案是允许 ActiveAdmin 控制器更新与用户相关的角色 ID。
ActiveAdmin.register User do
permit_params :email, :password, :password_confirmation, role_ids: []
这是一个显示每个全局角色的复选框的表单。
form do |f|
f.inputs "User Details" do
f.input :email
f.input :password
f.input :password_confirmation
f.input :roles, as: :check_boxes
end
f.actions
end
当我们这样做时,我们不妨让更新用户无需输入密码成为可能:
# Allow form to be submitted without a password
controller do
def update
if params[:user][:password].blank?
params[:user].delete "password"
params[:user].delete "password_confirmation"
end
super
end
end
将所有这些放在app/admin/user.rb中。
我不得不添加一些控制器代码来完成这项工作,我希望这会有所帮助:
请记住允许您在 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
希望这可以帮助!
我刚遇到这个问题。问题在于验证存在(我认为这发生在数据库“:null =>:false”中)。为了保存更新,我必须填写所有字段(包括密码/密码确认)。