Rails:仅对嵌套属性的CREATE操作使用REJECT_IF

时间:2014-12-26 18:10:00

标签: ruby-on-rails ruby-on-rails-4.1

所以我有一个Profile对象有很多多态子。如果特定对象的字段为空,则模型用于销毁after_save。

但对于accept_nested_attributes,如果它是空白的,我不想首先创建子对象。但是如果我离开reject_if语句,则用户不再能够在UPDATE上清空该字段,因为reject_if拒绝其空白输入。

accepts_nested_attributes_for :socials, reject_if: proc { |att| att['username'].blank? }
accepts_nested_attributes_for :phones, reject_if: proc {|att| att['number'].blank? }
accepts_nested_attributes_for :websites, reject_if: proc {|att| att['url'].blank? }

所以我想reject_if: { ... }, on: :create。但这似乎不起作用。

1 个答案:

答案 0 :(得分:10)

您可以创建一个方法,而不是将proc发送到reject_if选项,这是相同的,它只是更具可读性,所以代码看起来像:

accepts_nested_attributes_for :socials, reject_if: :social_rejectable?

private

 def social_rejectable?(att)
  att['username'].blank? && new_record?
 end

您可以重复这些方法,然后使用某些元编程进行清理,或在new_record?上添加proc方法

accepts_nested_attributes_for :socials, reject_if: proc { |att| att['username'].blank? && new_record?}