У меня есть пользователи и сайты с отношением has_many through
(SiteUser
- это таблица поиска, от которой зависит некоторая ролевая логика и приглашающая логика).Я использую Devise Invitable, чтобы владельцы сайтов могли приглашать других пользователей к сотрудничеству на своих сайтах.(сайты в моем случае являются синонимами организаций).
Но мне также нужно разрешить администраторам (используя Rails Admin) приглашать пользователей на любой сайт.Владельцы сайтов в интерфейсе внешнего интерфейса могут приглашать пользователей только на свои сайты.Но пользователь-администратор является администратором всего приложения (а не только сайта), и он должен иметь возможность приглашать пользователей на любые сайты.
Исходя из кода, который я уже реализовал, в Rails Admin есть форма для создания нового SiteUser
:
Я могу создать site_user
здесь.Но после редактирования site_user
он не отображает адрес электронной почты.Это потому, что email
- это поле в user
, а не site_user
.Как я могу получить rails_admin для отображения электронного письма user
на записи site_user
(учитывая отношения между ними)?
Я поделюсь кодом, который у меня есть для SiteUser
и User
, чтобы он мог помочь понять:
class SiteUser < ActiveRecord::Base
include RoleModel
roles :ad_settings, :reporting, :video, :payment, :owner
belongs_to :site
belongs_to :user
before_validation :set_user_id, if: ->() { email != nil }
attr_accessor :email
after_create :assign_owner, if: ->() { site.users.count == 1 }
def set_user_id
existing_user = User.find_by(email: email)
self.user = if existing_user.present?
UserMailer.notify_existing_user(site, existing_user).deliver_now unless Rails.env.test?
existing_user
else
User.invite!(email: email, invite_site_name: self.site.title)
end
end
def name
user.title
end
def assign_owner
roles << :owner
end
rails_admin do
object_label_method :email
show do
field :email
field :site
field :roles
end
edit do
field :site
field :email
field :roles, :integer do
partial :site_user_role_select
end
end
end
end
И соответствующий код для User
:
class User < ActiveRecord::Base
acts_as_token_authenticatable
attr_accessor :invite_site_name
devise :authy_authenticatable, :database_authenticatable, :lockable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :invitable
include RoleModel
roles :admin, :influencer
has_many :site_users
has_many :sites, through: :site_users
def send_email
if self.invitation_token.nil?
UserMailer.new_user(self).deliver_now unless Rails.env.test?
end
end
def my_sites
admin? ? Site.all : sites
end
def site
@site ||= sites.first
end
def name
title
end
rails_admin do
object_label_method :email
modal do
field :title do
label 'Full Name'
end
field :email
end
edit do
field :title do
label 'Full Name'
end
field :disable_authy do
label 'Two-Factor Auth'
partial :disable_authy
end
field :email
field :roles, :integer do
partial :role_select
end
field :sites
end
list do
field :title do
label 'Full Name'
end
field :email
field :sites
end
end
end
Кроме того, site_users
из schema.rb
:
create_table "site_users", force: :cascade do |t|
t.integer "site_id"
t.integer "user_id"
t.integer "roles_mask"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
TLDR: Какой лучший способ получитьАтрибут email
из user
для отображения в rails_admin для связанного объекта site_user
?