chr*_*mer 31 ruby forms collections ruby-on-rails
当用户提交表单并将某些字段留空时,它们将在数据库中保存为空白.我想遍历params [:user]集合(例如),如果字段为空,则在更新属性之前将其设置为nil.我无法弄清楚如何做到这一点,因为我知道迭代的唯一方法是创建新对象:
coll = params[:user].each do |c|
if c == ""
c = nil
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢.
Mat*_*ley 27
通过使用控制器中的过滤器来考虑您在此处所做的事情,以影响模型在保存或更新时的行为方式.我认为一个更清洁的方法是before_save在模型或观察者中回调.这样,无论更改源自何处,无论是通过控制器,控制台还是运行批处理,您都可以获得相同的行为.
例:
class Customer < ActiveRecord::Base
NULL_ATTRS = %w( middle_name )
before_save :nil_if_blank
protected
def nil_if_blank
NULL_ATTRS.each { |attr| self[attr] = nil if self[attr].blank? }
end
end
Run Code Online (Sandbox Code Playgroud)
这会产生预期的行为:
>> c = Customer.new
=> #<Customer id: nil, first_name: nil, middle_name: nil, last_name: nil>
>> c.first_name = "Matt"
=> "Matt"
>> c.middle_name = "" # blank string here
=> ""
>> c.last_name = "Haley"
=> "Haley"
>> c.save
=> true
>> c.middle_name.nil?
=> true
>>
Run Code Online (Sandbox Code Playgroud)
如果你只想杀死空白,你可以这样做params.delete_if {|k,v| v.blank?}.
小智 5
在模型中处理此问题的好宝石:https://github.com/rmm5t/strip_attributes
它定义了一个before_validation钩子,用于修剪空格并将空字符串设置为nil.