在ActiveAdmin中编辑has_one关联 - 在属性消隐时销毁

时间:2013-12-23 10:54:58

标签: ruby-on-rails ruby-on-rails-3 activeadmin

我有一个模型,其中很小一部分对象将具有相当大的描述性文本。为了保持我的数据库在某种程度上正常化,我想将这个描述性文本提取到一个单独的模型,但是我在ActiveAdmin中创建一个合理的工作流程时遇到了麻烦。

我的模特看起来像这样:

class Person < ActiveRecord::Base
  has_one :long_description

  accepts_nested_attributes_for :long_description, reject_if: proc { |attrs| attrs['text'].blank? }
end

class LongDescription < ActiveRecord::Base
  attr_accessible :text, :person_id
  belongs_to :person

  validates :text, presence: true
end

目前我已经创建了一个用于编辑Person模型的表单,看起来有点像这样:

  form do |f|
    ...
    f.inputs :for => [
                      :long_description,
                      f.object.long_description || LongDescription.new
                     ] do |ld_f|
      ld_f.input :text
    end

    f.actions
  end

这适用于添加/编辑LongDescription对象,如果没有输入文本,它可以验证/创建LongDescription对象。

我想要实现的是还能够删除LongDescription对象,例如,如果text属性再次设置为空字符串/ nil。

任何拥有比我更好的Rails或ActiveAdmin技能的人都知道如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

这似乎是一个非常不寻常的架构决策,但实现非常简单:

class LongDescription < ActiveRecord::Base

  validates_presence_of :text, on: :create

  after_save do
    destroy if text.blank?
  end
end