【问题标题】:Rails: use REJECT_IF only on CREATE action for nested attributesRails:仅对嵌套属性的 CREATE 操作使用 REJECT_IF
【发布时间】:2014-12-26 18:09:59
【问题描述】:

所以我有很多 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。但这似乎不起作用。

【问题讨论】:

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


【解决方案1】:

您可以创建一个方法,而不是将 proc 发送到 reject_if 选项中,这是相同的,只是更具可读性,因此代码如下所示:

accepts_nested_attributes_for :socials, reject_if: :social_rejectable?

private

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

您可以重复这些方法,然后用一些元编程来清理它,或者在proc 上添加new_record? 方法

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

【讨论】:

  • 未定义方法`new_record?'对于#<:parameters>
  • 尝试不使用 proc,在这种情况下使用完整方法 social_rejectable?(att) 它对我有用
  • 不能在 Rails 5 中工作,尽管文档说比 new_record?有效
  • ...问题是当嵌套模型有一个文件字段时,它会收到一个空白参数但文件“存在”,就像应该填充该字段但它不是
  • 由于安全原因,文件字段不会被填充,也许隐藏字段可以作为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多