Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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 如何为API版本模型验证?_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何为API版本模型验证?

Ruby on rails 如何为API版本模型验证?,ruby-on-rails,Ruby On Rails,关于API版本控制的一些想法: 为什么API版本控制是必要的?当我们想要对API端点进行一些破坏性的更改时,比如停止接受某些参数,或者如果我们删除响应的某些部分,这是已经使用我们的API的客户端所期望的,那么这是必需的。在这方面,我们是如何做到这一点的: 1.we create a new folder namespace api/v2; 2.we put there the controller, containing the new version of the endpoint api/v

关于API版本控制的一些想法:

为什么API版本控制是必要的?当我们想要对API端点进行一些破坏性的更改时,比如停止接受某些参数,或者如果我们删除响应的某些部分,这是已经使用我们的API的客户端所期望的,那么这是必需的。在这方面,我们是如何做到这一点的:

1.we create a new folder namespace api/v2;
2.we put there the controller, containing the new version of the endpoint api/v2/controllers/locations_controller.rb;
3.we implement our controller action;
4.maybe for the response we use a different active model serializer/jBuilder template.
但是,如果我们想更改模型的验证规则,我们该怎么办?让我们假设,我们有一个字段foo,在API的版本1中,它接受三个值a、b和c。因此,在模型中,我们有一个validaiton,如下所示:

validates :foo, inclusion: { in: %w(a b c) }
现在我们要删除其中一个值(a)并添加一个新值(d)。如果我们把模型中的validaiton改为

validates :foo, inclusion: { in: %w(b c d) }
我至少可以想到两个问题:

  • 如果旧端点的客户端发送参数foo的值,它们将得到一个验证错误
  • 如果我们通过新的点更新现有记录的另一个属性栏,该属性栏的foo值为a(过去通过旧端点设置),那么我们将得到一个验证错误,该foo不包括在列表中(这将是非常意外的,因为我们更新了属性栏,并且不希望得到foo的任何错误,我们根本不接触它)
  • 我想知道的是,是否有任何方法可以将版本控制添加到活动模型中以提及验证,例如,仅在第二个版本中使用validates\u presense\u of:mobile\u number


    因此,我想听听您对API版本控制问题的看法,您不仅要更改端点的请求和响应结构和内容,还要更改底层模型。谢谢。

    您可以使用表单对象模式对Api验证进行版本设置。您可以将验证从模型移动到表单类。有关更多信息,请检查它是否只是一个更改,然后可以添加一个条件,例如如果参数[]b,c,d]。存在,然后跳过验证并通过另一个方法进行检查。但是是的,正确的方法是创建一个v2文件夹,因为代码更易于阅读和维护。如果这种情况仅适用于一种型号,那么我建议使用
    attr\u访问器
    如“v1\u验证”和
    v2\u验证
    ,在控制器操作中,我使用的是您正在获取api的版本。为该验证添加
    true
    值,并在模型中为该验证添加条件。我希望你能理解我想说的话谢谢你的回复。这是所有模型的常见情况,因为更改可以出现在任何表中,并且关联的模型将被更改。您可以使用表单对象模式来版本Api验证。您可以将验证从模型移动到表单类。有关更多信息,请检查它是否只是一个更改,然后可以添加一个条件,例如如果参数[]b,c,d]。存在,然后跳过验证并通过另一个方法进行检查。但是是的,正确的方法是创建一个v2文件夹,因为代码更易于阅读和维护。如果这种情况仅适用于一种型号,那么我建议使用
    attr\u访问器
    如“v1\u验证”和
    v2\u验证
    ,在控制器操作中,我使用的是您正在获取api的版本。为该验证添加
    true
    值,并在模型中为该验证添加条件。我希望你能理解我想说的话谢谢你的回复。这是所有模型的常见情况,因为更改可以出现在任何表中,并且关联的模型将被更改。