■ 今回叶えたいこと@Admin画面

  • CSが触る想定(開発者ではない)
  • 企業-カスタマー(=User)の関係を更新したい
  • 新規カスタマー(=User)の追加を行いたい
  • カスタマー(=User)のパスワード再発行を行いたい

■ 注意点

  • 今回のUserはdevise経由で作成していないUserとなります。
  • AdminUser(devise経由) と User(ユーザー登録などの通常のform経由) がいるような形。
  • 今回はUser → Companyの一方向のみ、Company → Userはいじれない。

■ 内容

1. リレーションをモデルクラスに追加

class User < ApplicationRecord
  belongs_to :company
end
class Company < ApplicationRecord
  has_many :users, dependent: :destroy
  accepts_nested_attributes_for :users, allow_destroy: true
end

2. adminで見れるようにファイル作成

2-1. app/admin/compnies.rb

# app/admin/compnies.rb
ActiveAdmin.register Company do
  permit_params :id, 
              :name,
              users_attributes: [:email, :_destroy]

  form do |f|
    f.inputs "Company Details" do
      f.input :name
    end
    f.actions
  end

  show do
    attributes_table do
      row :name
      panel "Users" do
        table_for company.users do
          column :id
          column :email
        end
      end
      row :created_at
      row :updated_at
    end
  end

end

2-2. app/admin/users.rb

# app/admin/users.rb
ActiveAdmin.register User do
  permit_params :email, :password, :password_confirmation, :company_id

  # 参考: https://stackoverflow.com/questions/49059339/active-admin-devise-user-update-without-password
  before_action :remove_password_params_if_blank, only: [:update]
  controller do
    def remove_password_params_if_blank
      if params[:user][:password].blank?
        params[:user].delete(:password)
        params[:user].delete(:password_confirmation)
      else
        # モデル側でvalidation(=presence && length > 6)つけてると、保存できなくなる。
        # そのためモデル側のvalidationをやめ、入力時にエラー出させるように変更
        if params[:user][:password].length < 6
          flash[:danger] = 'パスワードは6桁以上で設定して下さい。'
        elsif params[:user][:company_id].blank?
          flash[:danger] = '所属企業が選択されていません。'
        end
      end
    end
  end
  
  form do |f|
    f.inputs "User Details( ※新しいパスワードは、入力されている場合のみ更新されます。 )" do
    f.input :email, label: 'メールアドレス'
    f.input :password, label: '新しいパスワード'
    f.input :password_confirmation, label: '新しいパスワード確認'
    f.input :company_id,
      label: '所属企業',
      as: :select,
      collection: Company.all.map { |c| [c.name, c.id] }
    end
    f.actions
  end

  show do
    attributes_table do
      row :email
      row :password_digest
      row :remember_digest
      row :enabled_speed_save
      row :created_at
      row :updated_at
    end
  end
end

3. 確認

3-1. Company追加

admin/companies/newでデータ追加

3-2. UserでCompany関連付け

こんな感じに、admin/users/:id/editで情報を編集出来る。

うむ。よき。