Rails:after_create回调仅在生产时触发

时间:2018-09-20 16:26:38

标签: ruby-on-rails ruby

任何人都知道为什么仅在生产环境上触发after_create回调吗?

class Schedule < ActiveRecord::Base

  belongs_to :account

  validates :schedule_type, presence: true # default = 'appointment'

  after_create :send_notification, if: :devices_and_appointment?

  def devices_and_appointment?
    account_has_devices? && schedule_type.appointment?
  end

  def account_has_devices?
    !account.devices.blank?
  end

  def appointment?
    schedule_type.eql?('appointment')
  end
end

在生产中,即使未指定schedule_type,也会触发回调。我检查了日志,控制器收到了预期的参数(schedule_type!=约会)

出于一个奇怪的原因,当调用after_create时,schedule_type是默认的。

我们在开发过程中甚至在升级env时都进行了检查,因此无法重现该错误。 暂存和生产之间的区别是DB分片(Octopus),但在其他一些控制器中,甚至在ScheduleController

中,我们仅激活了读取功能

我们最终将回调方法移至服务,在.save之后调用该函数,从而解决了该问题,但是我仍然想知道为什么会发生这种情况。

控制器:

def create
    @schedule = Schedule.new(schedule_params)

    if @schedule.save
      render json: @schedule, status: 201
    else
      render json: { errors: @schedule.errors }, status: 422
    end
end

def schedule_params
   params
      .require(schedule)
      .permit(:account_id, :cause, :ends_at, :schedule_type, :starts_at)
end

请求:

Parameters: {"schedule"=>{"cause"=>"cause random", "starts_at"=>"2018-09-17T21:00:00.000-05:00", "ends_at"=>"2018-09-17T21:30:00.000-05:00", "schedule_type"=>"blocked", "account_id"=>"123"}}

0 个答案:

没有答案