我只需要使用控制器,宝石等。如果我去掉导轨,(宝石,视图等),它还能正常工作吗?实现这一目标的最佳途径是什么?
答案 0 :(得分:2)
您可以使用rails-api。
Rails :: API是普通Rails应用程序的一个子集,为不需要完整Rails应用程序提供的所有功能的应用程序创建。它更轻巧,因此比普通的Rails应用程序快一点。其使用的主要示例仅在API应用程序中,您通常不需要整个Rails中间件堆栈或模板生成。
答案 1 :(得分:2)
您还可以查看an opinionated micro-framework for creating REST-like APIs in Ruby
Grape是一个类似REST的API微框架,适用于Ruby。它的目的是为了 在Rack上运行或补充现有的Web应用程序框架,例如 Rails和Sinatra通过提供简单的DSL来轻松开发RESTful 蜜蜂。它内置了对常见约定的支持,包括 多种格式,子域/前缀限制,内容协商, 版本化等等。
基本用法
Grape API是由子类创建的Rack应用程序 葡萄:: API。下面是一个简单的例子,展示了一些比较常见的例子 在重新创建Twitter部分的背景下Grape的功能 API。
module Twitter
class API < Grape::API
version 'v1', using: :header, vendor: 'twitter'
format :json
prefix :api
helpers do
def current_user
@current_user ||= User.authorize!(env)
end
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
end
resource :statuses do
desc 'Return a public timeline.'
get :public_timeline do
Status.limit(20)
end
desc 'Return a personal timeline.'
get :home_timeline do
authenticate!
current_user.statuses.limit(20)
end
desc 'Return a status.'
params do
requires :id, type: Integer, desc: 'Status id.'
end
route_param :id do
get do
Status.find(params[:id])
end
end
desc 'Create a status.'
params do
requires :status, type: String, desc: 'Your status.'
end
post do
authenticate!
Status.create!({
user: current_user,
text: params[:status]
})
end
desc 'Update a status.'
params do
requires :id, type: String, desc: 'Status ID.'
requires :status, type: String, desc: 'Your status.'
end
put ':id' do
authenticate!
current_user.statuses.find(params[:id]).update({
user: current_user,
text: params[:status]
})
end
desc 'Delete a status.'
params do
requires :id, type: String, desc: 'Status ID.'
end
delete ':id' do
authenticate!
current_user.statuses.find(params[:id]).destroy
end
end
end
end
另请查看ruby json implementations 感谢@oscar提供此链接
我更喜欢使用rabl
RABL示例:
然后我们可以创建以下RABL模板来表达API @posts的输出:
# app/views/posts/index.rabl
collection @posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }
输出:
[{ "post" :
{
"id" : 5, "title": "...", "subject": "...",
"user" : { "full_name" : "..." },
"read" : true
}
}]