向现有控制器添加新操作或向新控制器添加新操作?

时间:2016-08-11 12:48:37

标签: ruby-on-rails

RoR4应用。我有一个页面X,显示电子商务网站中的定价。因此,有一个定价控制器,其索引页面显示定价内容。有一个购买按钮,需要做以下事情:

  1. 如果单击,请检查用户是否已通过身份验证
  2. 如果经过身份验证,请将其带到第三方服务以获取信用卡信息
  3. 成功购买后,将流程重定向回原始电子商务网站
  4. 我的困境: 我应该添加新的购买控制器吗?或在现有的定价控制器中添加新方法购买。

2 个答案:

答案 0 :(得分:1)

这完全取决于您是否希望您的应用程序是RESTful。即使您的定价控制器目前只有索引操作,您可能希望以后创建new/edit操作(以添加价格),从而创建相应的create/update操作。

当然,如果你不想成为RESTful,那么你可以添加你想要的任何方法。但是,我认为遵循RESTful模式只是一个好习惯。这样的设计具有良好的定义和认可的语义,并且还可以防止控制器混乱。

因此,如果您决定使用购买控制器,我建议您执行以下操作:

  1. 使用create操作作为购买按钮的目的地。
  2. 在该create操作上添加一个before_action过滤器,用于检查身份验证。
  3. 我不确定您与第三方的界面是如何完成的,但我建议您使用某些密钥将有关您的交易/购买的所有重要信息记录到您的数据库中,然后才执行第三方购买调用
  4. 购买成功或失败后,您可以要求您的第三方重定向到您的购买控制器中的update操作,您可以在步骤3中使用返回信息更新您的记录(我更喜欢保存整个响应正文),然后根据状态重定向在内部重定向到您的定价页面,以防成功或某些错误处理页面。
  5. 我并不是说这是唯一可行的解​​决方案。但是,根据我之前的经验,我了解到将详细的事务日志保存在您自己的数据库中对于将来解决问题非常有用。

    所以,最后的答案是更喜欢单独的控制器,而不是添加一个不完全适合现有控制器的unRESTful方法。

答案 1 :(得分:0)

我认为拥有另一个控制器是好事,因为控制器的名称是定价控制器,我认为这并不能说明对付款或交易的担忧。

如何将新控制器设为payments_controller.rbtransactions_controller.rb

定价名称本身表示一些与价格相关的内容,其中付款或交易名称表示该功能的更接近目的。