【问题标题】:Updating Roles in rolify using ActiveAdmin使用 ActiveAdmin 更新 rolify 中的角色
【发布时间】:2013-12-09 16:13:35
【问题描述】:

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

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

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

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

编辑:

也使用设计。

【问题讨论】:

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


    【解决方案1】:

    这里的解决方案是允许 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 中。

    【讨论】:

    • 您也可以添加这一行来更新用户角色params[:user][:role_ids].each {|role_id| resource.add_role Role.find(role_id) if Role.exists?(id: role_id) }
    【解决方案2】:

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

    【讨论】:

    • 似乎没有保存所有字段。即使输入密码也不允许将数据保存到记录中。
    • 您是否显示了属于该模型的所有字段?我没有显示电子邮件字段,但是如果您查看用户的迁移文件,它应该会说明哪些字段需要输入。
    【解决方案3】:

    我不得不添加一些控制器代码来完成这项工作,我希望这会有所帮助:

    请记住允许您在 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
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2012-08-09
      相关资源
      最近更新 更多