为什么rails' update_attributes将param设置为null?

时间:2016-01-06 14:27:38

标签: ruby-on-rails rails-activerecord

使用update_attributes更新某些属性,我注意到一个特定属性被设置为null。我如何克服它,以便我可以用它的新值保存对象?

>> i=Item.find 4940       
#<Item id: 4940, sku: "ASKU", height: <BigDecimal:7fca72343e08,'0.1E3',9(18)>...>
>> i.sku
"ASKU"
>> i.update_attributes(sku: "3232434")
(0.1ms)  BEGIN
false
Item Exists (0.3ms)  SELECT  1 AS one FROM `items` WHERE (`items`.`sku` IS NULL AND `items`.`id` != 4940) LIMIT 1
(0.1ms)  ROLLBACK
>> i.sku
nil
>> i.errors.messages.inspect
"{:sku=>[\"can't be blank\", \"is too short (minimum is 3 characters)\"]}"

错误似乎是由验证规则引起的,该规则说该param应该存在 - 并且它确实存在 - 除非在它似乎消失时调用update_attributes!我已经删除了验证规则,它工作正常,但我现在有一个空白值,我需要一个有效值。

如何保留SKU值并更新对象?

更新解决方案:错误是由我在模型中使用的一些代码引起的,以确保该字段是upcased。删除以下修复的所有内容;

def sku=(s)
  super s.upcase!
end

1 个答案:

答案 0 :(得分:0)

错误是由我在模型中使用的一些代码引起的,以确保该字段是upcased。替换以下内容使其正常工作;

  def sku=(s)
    super s.upcase!
  end

...与

  before_validation :upcase_sku

  def upcase_sku
    self.sku.upcase!
  end