RailsでVirtual Attributes(仮想的な属性)をするでハマった

RailsでVirtual Attributes(仮想的な属性)をするでハマりました。

ruby-rails.hatenadiary.com

いつもお世話になっているこのサイトを参考に作成したのですが、、

  def set_name
self.name = [@last_name, @first_name].join(" ")
end

ここの部分が問題です。
saveやupdateをcontrollerやmodelで使う際に、必ずlast_nameやfirst_nameのparamsが送られてくれば問題ないのです。
しかし、仮にuserがpasswordカラムを持っていて、passwordを使ってログイン、その際にログイン情報を作成するためにuser.saveなどをするとvalidationエラーに引っかかります。
set_name内の@last_name,と@first_nameになにもsetされていないので""がself.nameに代入されます。
この状態でbefore_validationコールバックでset_nameメソッドを呼び出すと,saveやupdate時に毎回nameに""が代入されて,validationエラーを引き起こします。
そのため、last_nameとfirst_nameになにも代入されていない時は自身を返すように修正しました。

  def set_name
if @last_name.blank? && @first_name.blank?
name
else
self.name = [@last_name, @first_name].join(" ")
end
end

これで1時間くらいはまりました。。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です