[Rails_ActiveAdmin] 企業:ユーザー(1対1)の関係をいじれるようにしてみた
■ 今回叶えたいこと@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
で情報を編集出来る。
うむ。よき。