Как отобразить виртуальный атрибут в форме редактирования Rails Admin - PullRequest
0 голосов
/ 26 марта 2019

У меня есть пользователи и сайты с отношением has_many through (SiteUser - это таблица поиска, от которой зависит некоторая ролевая логика и приглашающая логика).Я использую Devise Invitable, чтобы владельцы сайтов могли приглашать других пользователей к сотрудничеству на своих сайтах.(сайты в моем случае являются синонимами организаций).

Но мне также нужно разрешить администраторам (используя Rails Admin) приглашать пользователей на любой сайт.Владельцы сайтов в интерфейсе внешнего интерфейса могут приглашать пользователей только на свои сайты.Но пользователь-администратор является администратором всего приложения (а не только сайта), и он должен иметь возможность приглашать пользователей на любые сайты.

Исходя из кода, который я уже реализовал, в Rails Admin есть форма для создания нового SiteUser:

enter image description here

Я могу создать site_user здесь.Но после редактирования site_user он не отображает адрес электронной почты.Это потому, что email - это поле в user, а не site_user.Как я могу получить rails_admin для отображения электронного письма user на записи site_user (учитывая отношения между ними)?

enter image description here

Я поделюсь кодом, который у меня есть для 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: Какой лучший способ получитьАтрибут email из user для отображения в rails_admin для связанного объекта site_user?

1 Ответ

1 голос
/ 26 марта 2019

Вы разместили тонны ненужной информации.

Ваш вопрос: Как отобразить виртуальный атрибут в форме редактирования 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

...