Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 Rails API最佳实践,JSON响应_Ruby On Rails_Json_Model View Controller - Fatal编程技术网

Ruby on rails Rails API最佳实践,JSON响应

Ruby on rails Rails API最佳实践,JSON响应,ruby-on-rails,json,model-view-controller,Ruby On Rails,Json,Model View Controller,我正在使用一个单独的Rails/Angular前端代码库开发Rails API后端。来自Rails API的响应必须以某种方式进行结构化,以与前端闪存消息相匹配。(n)(稍微简化)控制器响应示例如下: 呈现json:{status:“Unauthorized”,code:“AUTH.Unauthorized”,fallback_msg:“Unauthorized request”} 因此,基本上我所有的控制器都充满了这一点,有时当一个方法有5个可能的响应时(例如:如果用户重置了他们的电子邮件,则

我正在使用一个单独的Rails/Angular前端代码库开发Rails API后端。来自Rails API的响应必须以某种方式进行结构化,以与前端闪存消息相匹配。(n)(稍微简化)控制器响应示例如下:

呈现json:{status:“Unauthorized”,code:“AUTH.Unauthorized”,fallback_msg:“Unauthorized request”}

因此,基本上我所有的控制器都充满了这一点,有时当一个方法有5个可能的响应时(例如:如果用户重置了他们的电子邮件,则响应可能是无效密码、无效电子邮件、电子邮件已注册等)。一位同事建议将这些方法抽象到模型中,因此模型是发送回这些消息的响应,然后控制器就可以

def-ctrl\u方法
user=user.update(密码:password)
呈现json:用户,状态(用户)
结束
(其中status是根据对象的status属性提供HTTP状态代码的另一种方法)
我的问题是这是最佳实践吗?我理解Rails MVC,觉得发送json消息的责任属于控制器而不是模型。

我说你们都是对的。控制器应该负责发送消息,方法应该被抽象出来——而不是进入模型,更像是生活在
/lib
中的类


这也会使测试更容易。

在不知道更多细节的情况下,我会考虑利用关注点来处理状态。这允许封装业务逻辑,而不会弄乱您的模型。所以你本来可以

module Concerns
  module Statuses
    def deal_with_show
      # business logic goes here to generate the status
    end
    def deal_with_index
      # business logic goes here to generate the status
    end
    def deal_with_create
      # business logic goes here to generate the status
    end
    def default_status
      # set a default status here
    end
  end
end
然后在控制器中

class MyController < ApplicationController
  include Concerns::Statuses

  def index
    render json: deal_with_index
  end
end
class MyController
当然,关注点中状态的细分是任意的。它可以通过方法、动词或其他区别来处理


这是一个很好的例子。

如果你想处理ActiveRecord错误,我想你应该使用
错误。完整的消息
并对这些错误使用相同的代码和状态(状态:“禁止”,代码:“”)

请注意,您应该在区域设置文件中自定义消息。但如果你想用不同的语言翻译你的应用程序,它是很有用的

可以从控制器和操作中推断成功消息(见下文)

class ApplicationController
每个控制器方法都有自己的响应,不仅仅是get vs post它的索引vs show vs create等。好的,但这不会改变想法。使用关注点来组织跨控制器复制的逻辑是合适的。我修改了答案,使之更合适。