Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 购买模型设计建议(带网关交互)_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 购买模型设计建议(带网关交互)

Ruby on rails 购买模型设计建议(带网关交互),ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在制作一个购买模型来处理网站购买,它将与支付网关交互。我的问题是如何设计接口,我是应该使用单独的类方法来完成工作,还是应该使用回调来修补AR生命周期 起初,我做了一些像Purchase.make_Purchase(产品,…)这样的事情,作为一个类方法。但这看起来不太好 我将要实现的是一个解决方案,它使用模型生命周期和回调来进行购买和网关事务。大概是这样的: @purchase = Purchase.new @purchase.product = product @purchase.user

我正在制作一个购买模型来处理网站购买,它将与支付网关交互。我的问题是如何设计接口,我是应该使用单独的类方法来完成工作,还是应该使用回调来修补AR生命周期

起初,我做了一些像Purchase.make_Purchase(产品,…)这样的事情,作为一个类方法。但这看起来不太好

我将要实现的是一个解决方案,它使用模型生命周期和回调来进行购买和网关事务。大概是这样的:

@purchase = Purchase.new
@purchase.product = product
@purchase.user = current_user

if @purchase.save
else
end
然后,我将有一个与网关对话的before_save回调:

before_save :transfer_funds
设置@purchase.errors[:gateway\u error]


我不确定这是不是最好的办法。有什么建议吗?

我还没有用过它,所以我不能给出太多的见解,但如果你还没有用过,我会看一看。我不确定你的支付网关现在是什么,但如果你不使用它;你可能会有一些想法

编辑我意识到它没有回答问题,我只是想如果你还没有使用它,它可能会给你一些想法

我在支付处理方面没有直接的经验,所以你可以对我的意见持保留态度

我对使用生命周期方法的最大考虑是,在这种情况下,您可能需要在
transfer\u funds
方法中添加额外的逻辑。例如,如果一个
购买
可以在以后更新,那么每次更新时,您都将调用您的
转账资金
方法

我不确定
购买
是否有先授权后实际收费的概念,但我想
转账资金
应该只调用一次?您可以在创建之前将其移动到一个
,但这可能只会修复这一个场景

我还发现,将它们转移到生命周期方法通常可以为您的模型添加比期望更多的逻辑。在过去,我发现在控制器的动作中更加明确有时可以让我省去路上的麻烦,即使它为我增加了一个步骤,让我可以做每一个我需要转移资金的地方

我现在尝试将我的生命周期方法保留在模型类中,只与更新
ActiveRecord
模型本身相关,而不做太多额外的工作。如果把它放在你的控制器中是不可行的,我会考虑用一个AN来抽象出与<代码> TrimeApvest< <代码>有关的逻辑。
希望这能给你一些想法。

我正在使用active merchant,但这不是问题;)明白了,我更新了我的答案,以提供我个人使用生命周期方法的经验,希望它能给你一些想法。我已经用生命周期方法完成了85%的模型。我得出了与您相同的结论,即在创建之前,而不是保存之前。您可以在此处看到它(未完成)