我已经将Paypoint付款实施到我正在处理的项目中,并且在通行证中我使用了一个由控制器调用的类来处理付款并对响应采取行动,现在我已经重做这个以处理付款before_create回调,以便如果付款失败,转移回滚,我向模型添加错误,现在控制器代码,如果只是检查模型是否保存
旧控制器代码
def create
@model = Model.new(params[:xxx])
if @model.valid?
if PayPointPayment.authorise_payment(@model)
redirect_to new_step
else
render :new
else
render :new
end
新控制器代码
def create
@model = Model.new(params[:xxx])
if @model.save
redirect_to next_step
else
render :new
end
新型号代码
class Model
before_create :process_payment
def process_payment
if PayPointPayment.authorise_payment(self)
return true
else
<add errors>
return false
end
end
只是想知道这种设计的想法是好还是坏或者只是错误
答案 0 :(得分:2)
不是通过before_create
执行付款,而是在验证过程中运行付款更有意义。它可能会以相同的方式工作,但它发送给程序员的消息是验证是在保存模型对象之前必须满足的一系列要求,并且before_create
可能会处理需要的先决条件执行以允许创建最终模型。
此外,如果您更新了模型对象,它可能会更改模型足以要求重新验证,但before_create
将无法捕获它。
与原始机制相比,当然,这可能是几乎所有方面的巨大改进 - 它允许您的模型在原始控制器之外使用,而不会向没有付费的用户提供产品/内容。 (比如说,如果您公开了SOAP或XMLRPC或电子邮件或REST接口,而这些接口没有通过您的控制器运行。)