Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails在不复制代码的情况下构建API

Ruby on rails Rails在不复制代码的情况下构建API,ruby-on-rails,Ruby On Rails,假设我有一个PeopleController,我的用户在登录到我的应用程序时可以访问它 class PeopleController < ApplicationController def create # stuff here end end class PeopleController

假设我有一个PeopleController,我的用户在登录到我的应用程序时可以访问它

class PeopleController < ApplicationController    
  def create
    # stuff here
  end
end
class PeopleController
然后我的老板告诉我我们需要一个API,所以除了我们已有的API之外,我们还需要这样的API:

class API::V1::PeopleController < ApplicationController    
  def create
    # stuff here
  end    
end
class API::V1::PeopleController
像这样重复代码是不寻常的吗?我应该想办法把它弄干吗?我不介意有点重复,但看起来我必须通过API提供99%的现有代码库。

Rails way是一个控制器,它知道如何响应JSON和HTML。这就是为什么您要使用
/
响应
/等

没有理由分拆第二个API控制器,除非您真的希望API和非API控制器分开

如果您只是想将
/api/v1/people
路由到与
/people
相同的位置,则这是您的
配置/routes.rb
的工作。如果要在常规控制器的行为之上添加/更改API中的行为,则可以从非API控制器继承API控制器:

class API::V1::PeopleController < ::PeopleController    
class API::V1::PeopleController<::PeopleController

如果是基本crud,您可以使用相同的控制器响应html(适用于您的网站)和xml或json格式(适用于您的api)

class PeopleController@people}
format.html{redirect_to people_path(@people)}
结束
结束
结束

如果希望api的路由外观不同,则可以根据格式调整路由

如果api可能在应用程序的生命周期内发生更改,并且需要版本控制,则需要两个不同的控制器


但是,如果您的API可能是针对移动应用程序的,那么您的应用程序没有多个用户,并且不需要频繁地重新设置,那么您可以使用简单的控制器,只需用户
respond\u with
respond\u to

您的老板要求您实现版本控制。版本控制非常有用,尤其是在确保API端点的向后兼容性方面

在这种情况下,代码的重复可能是一个必要的问题,因为您不希望更新后的版本中的代码会改变功能,从而导致早期版本中出现问题


有一些宝石可以帮助您完成版本控制过程,因此复制代码和添加所需名称空间的大部分过程都是自动完成的。

有一个问题,API的版本很难实现。是的,谢谢,所有给出的答案都帮助我做出了这个困难的决定,@Acacia提到,我可能需要对API进行版本设置。干杯吧,回应技巧经常派上用场。谢谢。所有的答案都非常有用,这是最好的。欢迎使用stackoverflow。谢谢,我现在看到复制是值得的,因为我需要对API进行版本设置。干杯。谢谢你,我考虑过使用respond_to的格式,这是一个很好的回退,我喜欢rails有这些细微差别的事实。
class PeopleController < ApplicationController    
  def create
    respond_to do |format|
      format.xml {render :xml => @people}
      format.html {redirect_to people_path(@people)}
    end
  end
end