任何人都知道为什么仅在生产环境上触发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"}}