我有has_many through
关系的用户和网站(SiteUser
是查找表,其中一些角色逻辑和邀请逻辑铰接)。我正在使用Devise Invitable允许网站所有者邀请其他用户在其网站上进行协作。 (在我的案例中,网站是组织的同义词)。
但我还需要允许管理员用户(使用Rails管理员)邀请用户访问任何站点。前端UI中的站点所有者只能邀请用户访问他们自己的站点。但管理员用户是管理员应用程序范围(不仅仅是网站范围内),他们需要能够邀请用户访问任何网站。
基于我已经实现的代码,在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
对象的最佳方法是什么?
你发布了大量不必要的信息。
您的问题是:如何在Rails管理员编辑表单中显示虚拟属性? (最初的标题是:'邀请用户加入具有设计邀请和Rails管理员的组织')
rails_admin do
edit do
field :email do
read_only true
pretty_value do
bindings[:object].user&.email
end
end
end
end