我有具有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
的{{1}}:
schema.rb
TLDR:从 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
获取email
属性以在关联的user
对象的rails_admin中显示的最佳方法是什么?
答案 0 :(得分:1)
您已经发布了大量不必要的信息。
您的问题是: 如何在Rails Admin编辑表单中显示虚拟属性? (原始标题是:“使用Devise Invitable和Rails Admin邀请用户加入组织”)
rails_admin do
edit do
field :email do
read_only true
pretty_value do
bindings[:object].user&.email
end
end
end
end