QA@IT

rails モデル内の self

4088 PV

rails モデル内の self について質問させてください。 FAQ でしたらすみません。

環境

  • ruby-1.9.3-p374
  • rails 3.2.11

self の有無によって、属性更新の保存がうまくいきません。

class Entry < ActiveRecord::Base
  attr_accessible :body, :title

  # work fine
  def update_body_with_self(new_body)
    self.body = new_body
    save
  end

  # does not work
  def update_body_without_self(new_body)
    body = new_body
    save
  end
end

代入のときは self をつけるのが常識な感じでしょうか。
また、なぜこのような挙動になるのか、簡単でいいので回答いただければ幸いです。

回答

selfをつけないとローカル変数への代入になります

編集 履歴 (0)

私も未だにちゃんとわかっていないのですが、model.hoge = というのは、代入演算子ではなくhoge=っていうメソッド(ミミックメソッド)だと思います。
実際はattributesというフィールドにハッシュ形式でデータを保存しているようです。
具体的な例でいうなら、

  def show
    @sure = Sure.find(params[:id])
    binding.pry
    @sure.title = "hello"

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @sure }
    end
  end

とかいて、title=の所に対してstepを実行してください。(要:"pry","pry-debugger")
するとdef write_attribute(attr, value)というメソッドに飛んでいる事が分かると思います。

詳しくは
http://qa.atmarkit.co.jp/q/2571
を参照してください。

編集 履歴 (0)

早速の回答ありがとうございます。
write_attribute が呼ばれるところまでは確認してたんですが、なぜ self がないと
呼ばれないのか不思議でした。
確かに ruby レベルで考えると self を付けなければローカル変数への代入ですね。
FAQ な質問をしてすみませんでした。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。