如何在Rails管理编辑表单中显示虚拟属性

问题描述 投票:0回答:1

我有has_many through关系的用户和网站(SiteUser是查找表,其中一些角色逻辑和邀请逻辑铰接)。我正在使用Devise Invitable允许网站所有者邀请其他用户在其网站上进行协作。 (在我的案例中,网站是组织的同义词)。

但我还需要允许管理员用户(使用Rails管理员)邀请用户访问任何站点。前端UI中的站点所有者只能邀请用户访问他们自己的站点。但管理员用户是管理员应用程序范围(不仅仅是网站范围内),他们需要能够邀请用户访问任何网站。

基于我已经实现的代码,在Rails Admin中,有一个用于创建新SiteUser的表单:

enter image description here

我可以在这里创建site_user。但在编辑site_user时,它不会显示电子邮件地址。这是因为emailuser上的一个字段,而不是site_user。如何让rails_admin在user记录上显示site_user电子邮件(鉴于它们之间的关系)?

enter image description here

我将分享我为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_usersschema.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对象的最佳方法是什么?

ruby-on-rails rails-admin
1个回答
1
投票

你发布了大量不必要的信息。

您的问题是:如何在Rails管理员编辑表单中显示虚拟属性? (最初的标题是:'邀请用户加入具有设计邀请和Rails管理员的组织')

  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

© www.soinside.com 2019 - 2024. All rights reserved.