1. ホーム
  2. ruby-on-rails

[解決済み] Railsのafter_saveコールバックでどの属性が変更されたかを判定しますか?

2022-04-21 02:01:46

質問

モデルオブザーバーにafter_saveコールバックを設定し、モデルの 公開 属性が false から true に変更されました。のようなメソッドは 変更されたか? はモデルが保存される前にしか使えないので、現在私が試している(そして失敗している)方法は以下の通りです。

def before_save(blog)
  @og_published = blog.published?
end

def after_save(blog)
  if @og_published == false and blog.published? == true
    Notification.send(...)
  end
end

できればモデルオブザーバのコールバックを使って(コントローラのコードを汚染しないように)これを処理する最良の方法について、どなたかご提案がありますでしょうか?

解決方法は?

Rails 5.1+

使用方法 saved_change_to_published? :

class SomeModel < ActiveRecord::Base
  after_update :send_notification_after_change

  def send_notification_after_change
    Notification.send(…) if (saved_change_to_published? && self.published == true)
  end

end

あるいは、お好みで。 saved_change_to_attribute?(:published) .

Rails 3-5.1

警告

この方法は、Rails 5.1まで動作します (ただし、5.1では非推奨、5.2では破たんする変更があります)。この変更については、こちらの記事で紹介しています。 プルリクエスト .

あなたの中で after_update フィルター 使い道 _changed? アクセサーを使用します。だから例えば

class SomeModel < ActiveRecord::Base
  after_update :send_notification_after_change

  def send_notification_after_change
    Notification.send(...) if (self.published_changed? && self.published == true)
  end

end

ただ、うまくいくんです。