在 Rails API 中处理非 REST 逻辑

Handle non-REST logic in Rails API

例如,假设我有一个 Post 资源。 使用 GET /posts 我检索所有帖子(index 操作)。如果我想检索热门帖子(过去 24 小时内获得大量赞的帖子)怎么办?我应该在 index 操作中实现逻辑(通过参数),还是应该实现一个响应新端点 GET /trending 的新操作 trending,从而使 API非 REST?

注意:我阅读了 this article 并了解参数方式,但我无法弄清楚添加额外端点的工作原理...

您的 routes.rb 中可能有 resource :posts。这是您必须添加新端点的地方。在 rails 新动作的路径中。

你有

resources :posts

你应该

resources :posts do
  get 'trending', on: :collection
end

现在您可以看到 rails 为您生成的所有路线 line, index, show, create, update... 以及更多路线 trending

/posts/trending

你可以看这里:Rails guides add restful

两者都可以。我会选择新的行动。但是你也可以在 link 中传递一个额外的参数:

link_to posts_path(trending: true)

然后在您的控制器中,您可以检查是否 params[:trending].present? 然后仅将趋势 post 传递给 posts 变量 @posts

您还可以将趋势指标分配给将传递给索引视图的变量,以便调整布局(将 header 从 "posts" 更改为 "trending posts") if params[:trending].present? then @trending = true end

创建一个新动作可以减少控制器和视图的混乱情况(if ...)

顺便说一句,如果您将其设为 GET 查询,则创建新操作仍然是 REST 逻辑。如果您的新操作是关于更新 post,则需要 PATCHquery