我有一个模型Order
,其中可能有很多texts
。
文本可以有一个主动存储附件,我用active_storage_validations
gem验证了此附件。
我想保存有效的文本并拒绝无效的文本,因此我在reject_if
上使用了accepts_nested_attributes_for
选项...但是我想保留错误然后如果文本已经被渲染则呈现表格。拒绝了。
这是我的代码:
class Order < ApplicationRecord
has_many :texts, dependent: :destroy, validate: false
accepts_nested_attributes_for :texts, allow_destroy: true, reject_if: :invalid_text?
def invalid_text?(attributes)
text = Text.new(attributes.tap { |att| att.delete(:_destroy) })
return if text.valid?
text.errors.full_messages.each do |msg|
errors.add(:base, msg)
end
end
end
然后在我的控制器中
def update
if @order.update(order_params)
@order.update!(creation_step: 'instructions')
check_if_documents(@order, params[:file_upload_method])
Text.counter_culture_fix_counts
jump_to(:instructions)
else
flash.now.alert = @order.errors.full_messages.join('. ') if @order.errors.messages.any?
render(:show)
end
end
问题在于reject_if
之后会调用@order.update
,所以永远不会出错。
如何在访问活动存储属性的同时,在父更新之前验证嵌套属性?
如果我正在执行before_validation
回调,则无法使用nested_attributes_options
方法访问ActiveStorage属性...