如果我的模型已创建,我想发送短信。如果不是(无论出于何种原因)我不想发送它。这是发送短信的位:
def some_method
TWILIO_CLIENT.account.sms.messages.create(
:from => self.from,
:to => self.to,
:body => self.body
)
end
所以最初我想放回调:
after_create :some_method
但是我的模型会被保存,当some_method
产生异常时会发生什么,在这种情况下,模型仍会保存到数据库中。
所以我把它改成了验证:
validate :some_method
所以这就是我现在想的,我可以这样做:
def some_method
begin
TWILIO_CLIENT.account.sms.messages.create(
:from => self.from,
:to => self.to,
:body => self.body
)
rescue
errors.add(:base, "Error message")
end
end
所以在这种情况下,当发送短信期间发生异常时,它会阻止我的模型实例被保存吗?
或者有更好的方法吗?
此外,如果在some_method
验证之前某些其他验证失败,那么这个验证仍会被执行吗? (如果验证在其他地方失败,我不想发送短信)
问题更新:
如何让它全部协同工作。如果发送短信失败,或者由于某些原因我没有发送短信而导致对象无法保存,则回滚。但是只有在保存对象的情况下才发送短信?
另一次更新:(我最终在做什么)
class MyKls
before_create :some_method
def self.create_from_user_params(user)
some_kind_of_pin_generation = 1231312
MyKls.create({
:body => "Code is: #{some_kind_of_pin_generation}",
:from => TWILIO_NUMBER,
:to => user.phone,
:pin => some_kind_of_pin_generation,
:user_id => user.id
})
end
def some_method
TWILIO_CLIENT.account.sms.messages.create(
:from => self.from,
:to => self.to,
:body => self.body
)
rescue Twilio::REST::RequestError
return false
end
end
所以这是奇怪的一点:
当我尝试使用格式错误的手机创建MyKls
实例时会导致异常,例如:
MyKls.create(:to => 'blabla', ...someotherargs...)
导致回滚,因为它调用异常并且在after_create
回调中成功捕获了它。
但是,如果我使用类方法MyKls.create_from_user_params(user)
,无论用户手机的格式如何,都会保存实例。
为什么?
它适用于上面的创建,但它不适用于内部调用create的类方法?
当我将错误的格式电话设置为MyKls
实例时,会导致twilio异常。
答案 0 :(得分:0)
您可以执行before_create
...如果返回false,则会回滚创建
before_create :some_method
def some_method
TWILIO_CLIENT.account.sms.messages.create(
:from => self.from,
:to => self.to,
:body => self.body
)
return true
rescue
return false
end
(请注意,如果您在方法中使用救援,则不需要开始/结束)
您可能需要在控制器中测试object.persisted吗?测试保存是否成功....