在分配属性时处理异常并在一对多关系上添加错误
Handle exception while assigning attributes and add error on one to many relation
我们有一个模型,一个订单可以有多张卡片。每张卡片都与一张图片相关联。有时上传图片会出现异常。上传是用 carrierwave
挂载的。如何以及在何处捕获此异常并将错误添加到相应的卡中(最好在 card.rb class 中)?
我想我可以将问题概括为:在一对多关系上分配属性并将错误添加到相应字段时如何处理异常?
订单 class 看起来像这样(简化):
class Order < ActiveRecord::Base
has_many :cards, class_name: 'Card'
accepts_nested_attributes_for :cards, allow_destroy: true
end
卡片 class 看起来像这样(简化):
class Card < ActiveRecord::Base
mount_uploader :picture, PictureUploader
crop_uploaded :picture
end
控制器代码:
class OrderController < ApplicationController
def submit
order.assign_attributes(order_params)
if order.valid?
...
else
render :show
end
end
protected
def order_params
params.require(:order).permit(
card_attributes: [:picture_crop_x, :picture_crop_y, :picture_crop_w, :picture_crop_h, :picture, :_destroy]
end
end
我们解决了这个问题:
1) 为卡片模型添加了一个属性:
attr_accessor :crop_failed
2) 添加了验证方法:
validate :crop_success?
def crop_success?
errors.add(:picture, 'Image cannot be processed.') if crop_failed == true
end
3) 在上传器 class 中,我们捕获了异常并将属性 :crop_failed 设置为 true。
def crop
model.crop_failed = nil
...
rescue Exception => e
model.crop_failed = true
end
我们有一个模型,一个订单可以有多张卡片。每张卡片都与一张图片相关联。有时上传图片会出现异常。上传是用 carrierwave
挂载的。如何以及在何处捕获此异常并将错误添加到相应的卡中(最好在 card.rb class 中)?
我想我可以将问题概括为:在一对多关系上分配属性并将错误添加到相应字段时如何处理异常?
订单 class 看起来像这样(简化):
class Order < ActiveRecord::Base
has_many :cards, class_name: 'Card'
accepts_nested_attributes_for :cards, allow_destroy: true
end
卡片 class 看起来像这样(简化):
class Card < ActiveRecord::Base
mount_uploader :picture, PictureUploader
crop_uploaded :picture
end
控制器代码:
class OrderController < ApplicationController
def submit
order.assign_attributes(order_params)
if order.valid?
...
else
render :show
end
end
protected
def order_params
params.require(:order).permit(
card_attributes: [:picture_crop_x, :picture_crop_y, :picture_crop_w, :picture_crop_h, :picture, :_destroy]
end
end
我们解决了这个问题:
1) 为卡片模型添加了一个属性:
attr_accessor :crop_failed
2) 添加了验证方法:
validate :crop_success?
def crop_success?
errors.add(:picture, 'Image cannot be processed.') if crop_failed == true
end
3) 在上传器 class 中,我们捕获了异常并将属性 :crop_failed 设置为 true。
def crop
model.crop_failed = nil
...
rescue Exception => e
model.crop_failed = true
end