如何在 Rails 管理员编辑表单中显示虚拟属性
How to display a virtual attribute in a Rails Admin edit form
我的用户和站点具有 has_many through
关系(SiteUser
是查找 table,某些角色逻辑和邀请逻辑取决于此)。我正在使用 Devise Invitable 来允许网站所有者邀请其他用户在他们的网站上进行协作。 (在我的案例中,站点是组织的同义词)。
但我还需要允许管理员用户(使用 Rails 管理员)邀请用户访问 任何 站点。前端的站点所有者 UI 只能邀请用户访问他们自己的站点。但是管理员用户是整个应用程序范围内(不仅仅是站点范围内)的管理员用户,他们需要能够邀请用户访问任何站点。
根据我已经实现的代码,在Rails Admin中,有一个用于创建新SiteUser
的表单:
我可以在这里创建 site_user
。但是在编辑 site_user
时它不显示电子邮件地址。这是因为 email
是 user
上的字段,而不是 site_user
上的字段。如何让 rails_admin 在 site_user
记录中显示 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:从 user
获取 email
属性以在关联的 site_user
对象的 rails_admin 中显示的最佳方法是什么?
您发布了大量不必要的信息。
您的问题是:如何在 Rails 管理员编辑表单中显示虚拟属性?
(原标题为:'Inviting a User to an Organization with Devise Invitable and Rails Admin')
rails_admin do
edit do
field :email do
read_only true
pretty_value do
bindings[:object].user&.email
end
end
end
end
我的用户和站点具有 has_many through
关系(SiteUser
是查找 table,某些角色逻辑和邀请逻辑取决于此)。我正在使用 Devise Invitable 来允许网站所有者邀请其他用户在他们的网站上进行协作。 (在我的案例中,站点是组织的同义词)。
但我还需要允许管理员用户(使用 Rails 管理员)邀请用户访问 任何 站点。前端的站点所有者 UI 只能邀请用户访问他们自己的站点。但是管理员用户是整个应用程序范围内(不仅仅是站点范围内)的管理员用户,他们需要能够邀请用户访问任何站点。
根据我已经实现的代码,在Rails Admin中,有一个用于创建新SiteUser
的表单:
我可以在这里创建 site_user
。但是在编辑 site_user
时它不显示电子邮件地址。这是因为 email
是 user
上的字段,而不是 site_user
上的字段。如何让 rails_admin 在 site_user
记录中显示 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:从 user
获取 email
属性以在关联的 site_user
对象的 rails_admin 中显示的最佳方法是什么?
您发布了大量不必要的信息。
您的问题是:如何在 Rails 管理员编辑表单中显示虚拟属性? (原标题为:'Inviting a User to an Organization with Devise Invitable and Rails Admin')
rails_admin do
edit do
field :email do
read_only true
pretty_value do
bindings[:object].user&.email
end
end
end
end