Rabl Api并阻止代码重复

时间:2014-03-24 08:32:34

标签: ruby-on-rails json ruby-on-rails-3 api rabl

我正在为一个rails项目开发一个简单的API,它也应该能够进行版本控制。 我正在使用rabl-rails gem。

为了防止代码重复,我希望能够使用我的ControllerActions(例如UserController #search)两次。一次是普通的WebUsers,一次是API。

我只看到人们写这样的控制器:

class Api::v1::UsersController
  def list
    @user = User.all
  end
end

我是否需要RABL的命名空间控制器? 或者是否可以“路由或委托”#34;我对现有控制器的JSON请求?

例如我的常规UsersController行动"列表"实际上是这样的:

def list
  respond_to do |format|
    format.html
    format.json  { render @user }
  end
end

views/users/list.json.rabl也存在并在这种情况下运作良好。

现在我尝试将rabl文件移动到

/api/v1/users/list.json.rabl

我提供了一条路线:

namespace :api, :defaults => {:format => :json} do
  namespace :v1 do
    match 'users/list', to: 'Users#list', as: 'users', via: [:get, :post]
  end
end

目前我没有提供Api :: V1 :: UsersController。

的最佳方法是什么?
  • 提供/ api / v1 / users / list路线,但
  • 使用常规的UsersController和
  • 在/ api / v1 /文件夹中有list.json.rabl视图吗?

我希望不要复杂解释...

1 个答案:

答案 0 :(得分:1)

我最终认为API应该有自己的逻辑。有些动作可以查看特定内容(面包屑,下拉值等)。

凭借我的知识和搜索逻辑"可以被提取到一个模块中,该模块被混合到您的ApplicationController类(inlcude)中。然后,您可以在两个地方使用此逻辑:Api和常规Web视图。

我的第一次尝试就在这里:

BaseController

# Base Controller for all Api requests

class Api::V1::BaseController < ApplicationController
  respond_to :json
  acts_as_token_authentication_handler_for User
end

Api SubControllers

class Api::V1::UsersController < Api::V1::BaseController
# Inherit from BaseController -------^^^^^^^^^^^^^^^^^^^^^^^       

  # your personal extracted logic
  include SearchLogic

  def list
    @user  = User.all
  end 
end

所以