如何在 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 时它不显示电子邮件地址。这是因为 emailuser 上的字段,而不是 site_user 上的字段。如何让 rails_admin 在 site_user 记录中显示 user 电子邮件(鉴于它们之间的关系)?

我将分享 SiteUserUser 的代码,这样有助于理解:

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

阅读文档https://github.com/sferik/rails_admin/wiki/Fields