Techioz Blog

空白の params[] を nil にする

概要

ユーザーがフォームを送信し、特定のフィールドを空白のままにすると、DB に空白として保存されます。 (たとえば) params[:user] コレクションを反復処理し、フィールドが空白の場合は、属性を更新する前にそれを nil に設定したいと考えています。ただし、私が知っている唯一の反復方法は新しいオブジェクトを作成するため、これを行う方法がわかりません。

coll = params[:user].each do |c|
    if c == ""
       c = nil
    end
end

ありがとう。

解決策

コントローラーのフィルターを使用して、保存または更新時のモデルの動作に影響を与えることで、ここで何をしているのかを考えてみましょう。もっときれいな方法は、モデルまたはオブザーバーでの 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

これにより、期待どおりの動作が得られます。

>> 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
>>