Ruby on rails rablapi与防止代码重复

Ruby on rails rablapi与防止代码重复,ruby-on-rails,json,ruby-on-rails-3,api,rabl,Ruby On Rails,Json,Ruby On Rails 3,Api,Rabl,我正在为一个rails项目开发一个简单的API,它也应该能够进行版本控制。 我正在使用rablrails-gem 为了防止代码重复,我希望能够使用我的ControllerActions(例如UserController#search)两次。一次用于普通Web用户,一次用于API 我只看到有人这样写控制器: class Api::v1::UsersController def list @user = User.all end end 我必须为RABL创建命名空间控制器吗? 或者

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

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

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

class Api::v1::UsersController
  def list
    @user = User.all
  end
end
我必须为RABL创建命名空间控制器吗? 或者是否可以将我的JSON请求“路由或委托”到现有控制器

例如,我的常规
userscoontroller
Action“list”实际上包含以下内容:

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路由,但
  • 使用常规用户控制器和
  • 在/api/v1/文件夹中有list.json.rabl视图吗

我希望不要解释得太复杂…

我最后想到了一个想法,API应该有自己的逻辑。有些操作中包含视图特定的内容(面包屑、下拉值等)

据我所知,可以将“搜索逻辑”提取到一个模块中,该模块将混合到ApplicationController类(inlcude)中。然后,您可以在两个地方使用此逻辑:Api和常规web视图

我的第一次尝试是:

基站控制器
#所有Api请求的基本控制器
类Api::V1::BaseController
Api分包商
class Api::V1::UsersController

所以

我现在也面临着同样的问题,我正要发布一个问题。这看起来是我想要的。您将
SearchLogic
放在哪里?在
/lib
或其他地方?是的,我也读过
/lib
是“那个”地方。Rails 4似乎添加了新的require路径,称为“关注点”(参见此处)。一个用于
控制器
一个用于
型号
。我考虑到向上的兼容性(在3.2版本下工作),我只是在我的application.rb中添加了这些路径。我写了这样一个:
config.autoload_path+=%W(#{config.root}/controllers/concerns#config.root}app/models/concerns”)
。事实上,我在Rails 4上。网络上的大部分内容仍然主要面向Rails 3:)在Rails 4上,我需要添加到
配置自动加载路径吗?
?我将文件从
/lib
移动到
控制器/关注点
,但只有当我执行
时才需要“my_file.rb”
它才能工作。网络上的示例没有显示它们sing
require'my_file.rb'
。我同意。使用
include
extend
方法就像操作一样被线程化。我现在没有解决方法。但我正在努力。谢谢你的回复@Jan:)
# Base Controller for all Api requests

class Api::V1::BaseController < ApplicationController
  respond_to :json
  acts_as_token_authentication_handler_for User
end
class Api::V1::UsersController < Api::V1::BaseController
# Inherit from BaseController -------^^^^^^^^^^^^^^^^^^^^^^^       

  # your personal extracted logic
  include SearchLogic

  def list
    @user  = User.all
  end 
end