ruby模型控制器面向对象设计

时间:2011-01-31 07:28:28

标签: ruby oop

我已经将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

只是想知道这种设计的想法是好还是坏或者只是错误

1 个答案:

答案 0 :(得分:2)

不是通过before_create执行付款,而是在验证过程中运行付款更有意义。它可能会以相同的方式工作,但它发送给程序员的消息是验证是在保存模型对象之前必须满足的一系列要求,并且before_create可能会处理需要的先决条件执行以允许创建最终模型。

此外,如果您更新了模型对象,它可能会更改模型足以要求重新验证,但before_create将无法捕获它。

与原始机制相比,当然,这可能是几乎所有方面的巨大改进 - 它允许您的模型在原始控制器之外使用,而不会向没有付费的用户提供产品/内容。 (比如说,如果您公开了SOAP或XMLRPC或电子邮件或REST接口,而这些接口没有通过您的控制器运行。)