地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

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時間くらいはまりました。。。