Ruby on rails rablapi与防止代码重复
我正在为一个rails项目开发一个简单的API,它也应该能够进行版本控制。 我正在使用rablrails-gem 为了防止代码重复,我希望能够使用我的ControllerActions(例如UserController#search)两次。一次用于普通Web用户,一次用于API 我只看到有人这样写控制器: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创建命名空间控制器吗? 或者
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”
它才能工作。网络上的示例没有显示它们singrequire'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