使空白参数[]为零

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)

  • 在mvc中,它是控制器调解输入的一部分.模型不应该操纵传递给创建/更新函数的值,只能通过验证接受或拒绝. (5认同)
  • Ruby/Rails有些新东西,但不会在before_validate中比before_save更好吗? (3认同)

Chu*_*uck 8

如果你只想杀死空白,你可以这样做params.delete_if {|k,v| v.blank?}.

  • 小心这个.如果您正在使用update_attributes,并且您有允许为空的字段,则如果您从params哈希中删除它们,则用户将永远无法清除这些字段. (26认同)
  • 为了解决@ jdl的问题,在条件中使你想要显式删除的参数:`params.delete_if {| k,v | %w(killme1 killme2).include?(k)和v.blank?}` (2认同)

小智 5

在模型中处理此问题的好宝石:https://github.com/rmm5t/strip_attributes

它定义了一个before_validation钩子,用于修剪空格并将空字符串设置为nil.