代码之家  ›  专栏  ›  技术社区  ›  Ben

Wich回调必须用于获取以前的值吗?

  •  0
  • Ben  · 技术社区  · 1 年前

    在更新时,如果以前的值=,我将尝试发送一封电子邮件!发布并发布新值。我试过after_save,before_action。。。

    例如,如果

    @ad.status==“挂起”并更新为“已发布”

    @ad.status_ware!='已发布'返回true

      class Shop::AdsController < Admin2Controller
        before_action :set_ad, only: %i[edit update destroy]
        before_action :send_notification_if_published, only: :update
    
        def send_notification_if_published
          return unless @ad.status_was != 'published' && @ad.status_published?
          notification = Notification.find_by(action: 'ad_published')
    
          subscribed_users = User.joins(:notification_preferences)
                                 .where(notification_preferences: { notification_id: notification.id })
    
          subscribed_users.each do |user|
            NotificationsMailer.new(user, notification, self).deliver_later
          end
        end
      end
    
    0 回复  |  直到 1 年前
        1
  •  2
  •   Alex    1 年前

    在里面 before_action @ad 是你从中得到的 set_ad 。它还没有更新,而且是新的 ad_params 尚未分配。所以 @ad.status @ad.status_was 都是 pending .

    # this is what you're doing
    @ad = Ad.first
    @ad.status     #=> "pending"
    @ad.status_was #=> "pending"
    
    # but you expect this, which doesn't happen
    @ad.attributes = {status: "published"}
    @ad.status     #=> "published"
    @ad.status_was #=> "pending"
    
    # this happens only after the update
    @ad.update({status: "published"})
    @ad.status                #=> "published"
    @ad.status_was            #=> "published"
    @ad.status_previously_was #=> "pending"
    

    在控制器中,您可以使用 after_action ,或者直接放进去 update 行动,因为你需要知道广告实际上已经成功更新。

    在模型中 after_update 应该这样做。

    使用 status_was 更改属性后。使用 status_previously_was 保存这些更改之后。