如何解决ActiveAdmin中Guest关联User筛选时显示对象字符串而非邮箱的问题
解决ActiveAdmin下拉显示用户邮箱的问题
有两种常用方法可解决该问题:
方法一:在User模型中定义to_s方法
修改User模型,让对象转换为字符串时返回邮箱,这样所有需要显示User对象的场景都会自动使用邮箱:
class User < ApplicationRecord has_many :guests, dependent: :destroy def to_s email end end
这种方式一劳永逸,不仅ActiveAdmin的下拉框,其他任何需要展示User对象的地方都会生效。
方法二:在ActiveAdmin配置中单独指定显示字段
如果不想修改User模型的全局行为,可在Guest的ActiveAdmin配置里单独设置下拉框的显示字段:
ActiveAdmin.register Guest do index do column :user, sortable: 'users.email' column :name end # 修改筛选器,指定用邮箱作为显示文本 filter :user, as: :select, label_method: :email, collection: -> { User.all.order(:email) } form do |f| f.inputs do # 修改表单下拉框,指定用邮箱作为显示文本 f.input :user, as: :select, label_method: :email, collection: User.all.order(:email) f.input :name end actions end controller do def scoped_collection end_of_association_chain.includes(:user) end end end
通过label_method: :email指定下拉选项展示用户邮箱,collection参数可对用户列表按邮箱排序,提升下拉框的易用性。
两种方法均可解决问题,可根据项目需求选择:若全局场景都需要用邮箱展示User对象,选方法一;仅ActiveAdmin场景需要则选方法二。
内容的提问来源于stack exchange,提问作者DoubleD
相关产品推荐
相关产品推荐

