3

Rails 4.0、ActiveAdmin、Rolify、および CanCan を使用して、activeadmin パネルを介してユーザー ロールを追加および削除しても保存されません (データベースにコミット)。

チェックボックスを使用してユーザーに適用されるすべてのロールを一覧表示できるため、私のActiveAdmin ユーザーとユーザー モデルは問題ないように見えます。ただし、チェックボックスを使用して役割を追加または削除しても、変更は適用されません。

ここに画像の説明を入力

ユーザーが正常に更新されたという通知を受け取りましたが、データベースを調べたり、ページをレンダリングしたりしても、役割が更新されていません。

フォームが保存されたときに役割を更新するにはどうすればよいですか?

編集:

Deviseも使用。

ここに画像の説明を入力

4

3 に答える 3

11

ここでの解決策は、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に入れます。

于 2014-09-02T06:17:23.547 に答える
0

これを機能させるには、いくつかのコントローラーコードを追加する必要がありました。これが役立つことを願っています:

active_admin で受け入れる属性を許可することを忘れないでください (これにより、permitted_params後で参照するメソッドが作成されます。

role_ids をユーザーに直接保存していないため、許可されたパラメーターである必要さえないことに注意してください。

  permit_params :email, :password, :etc

create および update コントローラーから呼び出すことができるプライベート メソッドを作成します。このメソッドは、空でない ID を繰り返し処理し、関連付けられたロールを見つけて、それらを に追加しますuser.roles

add_rolescreate メソッドと update メソッドは、実行を継続する前にメソッドを呼び出すだけです。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

お役に立てれば!

于 2014-01-15T02:30:42.600 に答える
0

この問題に遭遇しました。問題は、存在の検証にありました(データベース「:null =>:false」で発生していると思います)。更新を保存するには、すべてのフィールドに入力する必要がありました (パスワード/パスワードの確認を含む)。

于 2013-12-09T20:10:14.190 に答える