前提
accepts_nested_attributes_for
を使ったreject_if
の指定方法において、
以下のように:all_blank
を指定すると、該当フォームがすべて空の場合に無視してくれる。
has_many :users
accepts_nested_attributes_for :users, reject_if: :all_blank
課題
デフォルト値が設定されているカラムがあるモデルに対するフォームの場合、
:all_blank
を指定すると、「デフォルト値のみ入力されている状態」はrejectできない。
解決策
以下のように指定すると良い。
has_many :users
accepts_nested_attributes_for :users, reject_if: :reject_user
# デフォルト値が設定されているカラム以外が全て空ならreject
def reject_user(attributes)
attributes.except(:デフォルト値が設定されているカラム名).values.all?(&:blank?)
end
attributes
にはフォームの入力値がハッシュ形式で入っているため、
まずは、attributes
からデフォルト値が設定されているカラムをexcept
で除外する。
次にvalues
でハッシュの値部分のみを配列にして、
その全ての要素に対して、blank?
関数を実行する。
all?
メソッドは配列の全てに対して、指定したメソッドを実行し、
指定した関数が全ての要素に対してtrue
を返せばtrue
を、
ある要素が1つでもfalse
を返したらfalse
を返す関数である。