在休息api

时间:2016-03-18 09:19:08

标签: ruby-on-rails rest

在处理我的REST api时,我想知道什么是最佳实践,当你需要处理某些动作时,让我用一个例子来解释。

说我有以下型号。

  create_table "requests", force: :cascade do |t|
    t.datetime "start_date"
    t.float    "price"
    t.string   "status",            default: 'open'
    t.datetime "created_at",                    null: false
    t.datetime "updated_at",                    null: false
  end

然后我将为该模型提供通常的CRUD路径/操作(显示,创建,更新,销毁)。

好吧,说我想将给定请求记录的状态更改为“已接受”,我会将更新的属性发送到更新路径,并且wola。

但是,如果我想对某些状态更新作出反应,我可能希望在请求更新时向相关用户发送邮件。

我可以为该行为创建一个完整的新操作。

/api/v1/request/:id/approve

然后我可以发送邮件并在我的操作中更新请求的状态。

但是我不禁觉得我应该使用更新功能,因为我真正在做的只是更新请求状态,邮件更像是一种“副作用”。

然后我看了How to detect attribute changes from model?而不是让我将功能传递给模型,如果状态在保存之前发生了变化,则发送邮件。 然而,这将导致很多之前的行动,我也没有特别漂亮。

你推荐什么?

2 个答案:

答案 0 :(得分:0)

您建议的方法在不同的情况下都可以正常工作:

  1. 假设您有一个应用程序,其中任何更改都非常关键,应立即通知,然后您可以将邮件功能传递给您的模型,并在更新值后发送邮件。
  2. 如果您的更改不是那么重要,如果用户在一段时间后收到通知就可以了,那么您可以

    I)您可以按照建议进行更新通话

    II)您可以将邮件功能添加到队列中,sperate阅读器将从队列中读取并相应地向用户发送邮件(如果您拥有大量用户,这将是有利的)

答案 1 :(得分:0)

你可以做什么(我相信什么是有效的REST方式):

  • 创建一个名为RequestApproveController左右的新控制器。
  • 在该控制器中创建操作create
  • 在名为Request的{​​{1}}模型上创建方法(在那里更新属性并发送电子邮件)
  • 创建一个与approve
  • 匹配的/api/v1/request/:id/approve路线