Rails构建API而不重复代码

时间:2014-07-09 16:34:20

标签: ruby-on-rails

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

class PeopleController < ApplicationController    
  def create
    # stuff here
  end
end

然后我的老板告诉我我们需要一个API,所以除了我们已经拥有的东西之外,我们还会使用这样的东西:

class API::V1::PeopleController < ApplicationController    
  def create
    # stuff here
  end    
end

这样的代码重复是不寻常的吗?我应该找一种干涸的方法吗?我不介意一点重复,但看起来我将不得不通过API提供99%的现有代码库。

4 个答案:

答案 0 :(得分:4)

老板问你的是实施版本控制。版本控制对于确保API端点的向后兼容性非常有用。

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

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

答案 1 :(得分:1)

“Rails方式”是一个控制器,它知道如何响应JSON和HTML。这就是您respond_to / respond_with / etc。

的原因

没有理由剥离第二个API控制器,除非您实际上希望让您的API和非API控制器发生分歧。

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

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

答案 2 :(得分:1)

如果是基本的问题,你可以让同一个控制器响应html(对于你的网站)和xml或json格式(对于你的api)

class PeopleController < ApplicationController    
  def create
    respond_to do |format|
      format.xml {render :xml => @people}
      format.html {redirect_to people_path(@people)}
    end
  end
end

如果您希望路线看起来与api

不同,您可以根据格式调整路线

答案 3 :(得分:1)

如果API可能会在应用程序的生命周期内发生变化并需要版本控制,那么您需要两个不同的控制器。

但是,如果您的API可能适用于移动应用程序,则没有多个用户且不需要经常重新构建视图,那么只需要一个简单的控制器,只需用户respond_withrespond_to