在一个项目中遇到了一个要求,其中应该根据他的公司询问登录用户的特定数据。该特定数据将是公司特定的,并且可能是强制性的或唯一的。这是我采取的方法。1. 用三个字段定义模型:Label(字符串)、Mandatory(布尔值)、Unique(布尔值)。2. 公司管理员可以输入必填字段。例如:Label => "Employee number", Mandatory => true, Unique => false using a simple form.
3. 此数据应在为登录用户创建另一条模型兑换优惠券记录时询问。4. 所以在Redeemed Coupon 模型的初始化过程中,重新开课,并检查登录用户的公司。
class RedeemedCoupon
def initialize(attrs = nil, options = nil)
super
if Merchant.current #this is set in the application controller as thread specific variable
coupon_custom_field = CouponCustomField.where(:merchant_id => Merchant.current).first
if coupon_custom_field and coupon_custom_field.custom_fields.size > 0
coupon_custom_field.custom_fields.each do |custom_field|
class_eval do
field custom_field.label.to_sym, :type => String
attr_accessible custom_field.label.to_sym
end
if custom_field.unique
class_eval do
index custom_field.label.to_sym
#validates_uniqueness_of custom_field.label.to_sym, :case_sensitive => false
end
end
if custom_field.mandatory
class_eval do
#validates_presence_of custom_field.label.to_sym
end
end
end
end
end
结尾
但是,验证验证存在和唯一性不起作用,并给出失败消息:未定义回调。这是在保存之前抛出的,什么时候is_valid?称为对象。解决这个问题 进行自定义验证
validate :custom_mandatory_unique
def custom_mandatory_unique
if Merchant.current
coupon_custom_field = CouponCustomField.where(:ira_merchant_id => Merchant.current).first
if coupon_custom_field and coupon_custom_field.custom_fields.size > 0
coupon_custom_field.custom_fields.each do |custom_field|
field_value = self.send(custom_field.label.to_sym)
self.errors.add(custom_field.label.to_sym, "cannot be blank") if !field_value.present? and custom_field.mandatory
if field_value.present? and custom_field.unique
if RedeemedCoupon.where(custom_field.label.to_sym => field_value, :merchant_id => Merchant.current).size > 0
self.errors.add(custom_field.label.to_sym, "already taken")
end
end
end
end
end
结尾
我的问题: 1. 这是最好的方法吗?2. 是否有任何宝石已经存在(已搜索,但无法获得)?3. 我怎样才能在这里使用验证助手而不是定义一个单独的验证块?