处理before_save rails的智能方法

时间:2014-05-16 16:12:44

标签: ruby-on-rails ruby validation exception callback

如果我的模型已创建,我想发送短信。如果不是(无论出于何种原因)我不想发送它。这是发送短信的位:

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异常。

1 个答案:

答案 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吗?测试保存是否成功....