如何在ActiveAdmin的has_many关联中默认显示最少子项(如1个)?
问题描述
我有一个图书集合,每本图书可关联多个作者,Book与BookAuthor模型之间是has_many关联。我在ActiveAdmin中构建的表单如下:
f.has_many :book_authors, heading: 'Authors', allow_destroy: true do |ba| ba.input :author_type, include_blank: false, input_html: { autocomplete: 'off' } ba.input :author, input_html: { autocomplete: 'off' } end
请问在创建新书时,能不能通过Ruby/Rails端优雅地实现默认显示最少数量的子项(比如1个)?我知道可以用JavaScript模拟点击“添加新项”按钮,但这种方式不够优雅。
解决方案
不用靠JS模拟点击,直接在Ruby/Rails后端就能优雅实现——给新建的Book对象预设好足够数量的空BookAuthor关联项就行,表单加载时会自动渲染出这些子项。
方法1:在ActiveAdmin表单里直接处理
修改你的ActiveAdmin代码,在渲染作者关联表单前,判断当前图书是不是新建记录,如果是且关联的作者项数量不够,就手动构建空的BookAuthor:
ActiveAdmin.register Book do form do |f| f.inputs '图书信息' do # 这里放图书的其他字段,比如书名、出版日期 f.input :title f.input :published_date end # 给新建图书默认加1个作者输入项 if f.object.new_record? && f.object.book_authors.size < 1 1.times { f.object.book_authors.build } end f.has_many :book_authors, heading: '作者', allow_destroy: true do |ba| ba.input :author_type, include_blank: false, input_html: { autocomplete: 'off' } ba.input :author, input_html: { autocomplete: 'off' } end f.actions end end
方法2:在Book模型里加回调(更通用)
要是想让整个应用里新建图书时都默认带一个空作者项,直接在模型层加个创建前的回调就行,这样不管是ActiveAdmin还是其他表单都能生效:
class Book < ApplicationRecord has_many :book_authors, dependent: :destroy accepts_nested_attributes_for :book_authors, allow_destroy: true before_validation :add_default_author, on: :create private def add_default_author book_authors.build if book_authors.empty? end end
这样两种方法都能满足需求,完全后端处理,比JS模拟优雅多了。
内容的提问来源于stack exchange,提问作者user859999
相关产品推荐
相关产品推荐

