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

时间:2019-03-26 14:28:27

标签: ruby-on-rails rails-admin

我有具有has_many through关系的用户和站点(SiteUser是查找表,在该表上有一些角色逻辑和邀请逻辑依赖)。我正在使用Devise Invitable允许网站所有者邀请其他用户在其网站上进行协作。 (在我的情况下,网站与组织同义)。

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

根据我已经实现的代码,在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_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中显示的最佳方法是什么?

1 个答案:

答案 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

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