在ActiveAdmin中编辑has_one关联 - 避免在未输入任何内容时保存

时间:2013-12-21 17:04:34

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

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

我的模特看起来像这样:

class Person < ActiveRecord::Base
  has_one :long_description
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对象。

任何具有比我更好的ActiveAdmin技能的人都知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

您使用的是accepts_nested_attributes_for :long_description吗?如果是这样,您可以添加:reject_if选项:

class Person < ActiveRecord::Base
  has_one :long_description
  accepts_nested_attributes_for :long_description, reject_if: proc { |attrs| attrs['text'].blank? }
end

请注意,这是一个Rails的东西,而不是ActiveAdmin的东西,所以如果缺少该属性,它将简单地跳过赋值和更新/创建嵌套对象。

更多信息:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html