假设我有一个PeopleController,我的用户在登录我的应用程序时可以访问它
class PeopleController < ApplicationController
def create
# stuff here
end
end
然后我的老板告诉我我们需要一个API,所以除了我们已经拥有的东西之外,我们还会使用这样的东西:
class API::V1::PeopleController < ApplicationController
def create
# stuff here
end
end
这样的代码重复是不寻常的吗?我应该找一种干涸的方法吗?我不介意一点重复,但看起来我将不得不通过API提供99%的现有代码库。
答案 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_with
和respond_to
。