空白の 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
>>