使用ActiveAdmin更新rolify中的角色

时间:2013-12-09 16:13:35

标签: ruby-on-rails-4 activeadmin cancan rolify

使用Rails 4.0,ActiveAdmin,Rolify和CanCan,通过activeadmin面板添加和删除用户角色不会保存(提交到数据库)。

我的ActiveAdmin User and User Model看起来没问题,因为我可以使用check_boxes列出适用于用户的所有角色。虽然通过复选框添加任何角色或删除任何角色时,不会应用更改。

enter image description here

我收到用户已成功更新的通知,但在查看数据库或呈现页面时,角色尚未更新。

如何在保存表单时让角色更新?

编辑:

也使用Devise。

enter image description here

3 个答案:

答案 0 :(得分:7)

此处的解决方案是允许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

答案 1 :(得分:0)

我刚遇到这个问题。问题在于存在的验证(我认为在数据库中发生了“:null =>:false”)。为了保存更新,我必须填写所有字段(包括密码/密码确认)。

答案 2 :(得分:0)

我必须添加一些控制器代码才能使其正常工作,我希望这会有所帮助:

请记住允许您在active_admin中接受的属性(这将创建我稍后将引用的permitted_params方法。

请注意,由于我们没有将role_ids直接保存给用户,因此它甚至不必是允许的参数。

  permit_params :email, :password, :etc

创建一个我们可以从创建和更新控制器调用的私有方法。此方法将迭代非空ID,查找关联角色,并将其添加到user.roles

创建和更新方法只是在继续执行之前调用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

希望这有帮助!