我有两个API,我试图在我的Rails应用程序中安装 - 一个名为'v1',另一个名为'twilio'.每个API都将由多个文件组成,因此我希望每个文件都有自己的文件夹.在我的app/api目录中,我有2个文件夹 - 'v1'和'twilio' - 以及一个名为'api.rb'的文件,我试图用它来安装两个api.它的内容是:
module API
class V1 < Grape::API
prefix "api"
format :json
mount API::Root => '/v1'
end
class Twilio < Grape::API
prefix "twilio"
format :xml
mount API::Twilio_API => '/twilio'
end
end
Run Code Online (Sandbox Code Playgroud)
在'v1'目录中,我有一个名为'root.rb'的文件,其开头如下:
module API
class Root < Grape::API
version 'v1', :using => :header
...
Run Code Online (Sandbox Code Playgroud)
在'twilio'目录中,我有一个名为'twilio_api.rb'的文件,其开头为:
module API
class Twilio_API < Grape::API
version 'v1', :using => :header
...
Run Code Online (Sandbox Code Playgroud)
我的路线文件有:
mount API::V1 => "/"
mount API::Twilio => "/"
Run Code Online (Sandbox Code Playgroud)
当我启动我的rails服务器时,我收到错误:
`load_missing_constant': Expected [My rails app]/app/api/v1/root.rb to define Root …Run Code Online (Sandbox Code Playgroud) 我试图在Rails 3.2.11应用程序中运行Grape API.根据葡萄文档,我应该在我的config/application.rb中添加以下行.
# Auto-load API and its subdirectories
config.paths.add "app/api", :glob => "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
Run Code Online (Sandbox Code Playgroud)
并使用以下代码创建config/initializers/reload_api.rb:
if Rails.env.development?
api_files = Dir["#{Rails.root}/app/api/**/*.rb"]
api_reloader = ActiveSupport::FileUpdateChecker.new(api_files) do
Rails.application.reload_routes!
end
ActionDispatch::Callbacks.to_prepare do
api_reloader.execute_if_updated
end
end
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用.这是我的代码.在我的app/api/v1.rb中:
module Api
class V1 < Grape::API
get '/hello' do
[]
end
end
end
Run Code Online (Sandbox Code Playgroud)
和我的config/routes.rb:
Blog::Application.routes.draw do
mount Api::V1 => "/"
end
Run Code Online (Sandbox Code Playgroud)
当我跑步时,rake routes我得到以下错误:
uninitialized constant Api
/home/zoloo/code/nomin/config/routes.rb:7:in `block in <top (required)>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:282:in `instance_exec'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:282:in `eval_block'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:260:in `draw'
/home/zoloo/code/nomin/config/routes.rb:5:in `<top (required)>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:40:in `block in …Run Code Online (Sandbox Code Playgroud) 我想在我的API中使用CanCan进行授权.我怎样才能使用authorize!Grape :: API模块中的方法?现在,当我尝试使用它时,它会返回给我:
undefined method 'authorize!' for #<Grape::Endpoint:0xca39664>
所以,我有这个系统我正在使用 rails 4 和 Grape Api。基本上,它汇总了有关在车辆上执行的维护服务的信息。我的模型定义如下:
# service.rb
class Service < ActiveRecord::Base
has_many :service_items
#service_item.rb
class ServiceItem < ActiveRecord::Base
belongs_to :service
Run Code Online (Sandbox Code Playgroud)
我实现了一个 API,以便外部应用程序可以在我的系统上发布服务。每个服务都有一个关联的 1 个或多个服务项目的列表。我有一个类似的路由:example.com/api/v1/services for POST。我的问题是如何让它接受带有 service 属性和嵌套在它上面的 service_items 属性的帖子?
我阅读了 Grape 文档并开始了这样的事情:
#service_providers_api.rb
resource :services do
desc "Post a Service"
params do
#requires :category_id, type: Integer
requires :description, type: String
requires :plate, type: String
requires :mileage, type: Integer
requires :date, type: Date
optional :cost, type: BigDecimal
requires :service_items do
requires :description, type: Integer
end
end
post do
. …Run Code Online (Sandbox Code Playgroud) 我有一个基于 Grape 的 API 的 Rails 4.2 应用程序。我开始使用 Rpsec 为它编写测试。我的测试效果很好,并测试了我的预期。但是当我rspec在终端运行时,Simplecov 没有显示 api 文件的正确覆盖范围,如下图所示。
目录上的文件/lib/api/app 确实有一些覆盖范围。但 Simplecov 将它们显示为 0%。
为了进行比较,我使用内置的覆盖率工具在 RubyMine 中运行规范,它显示了正确的覆盖率:
那么,我在这里错过了什么吗?simplecov 有什么问题?
这是我的rails_helper.rb:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'simplecov'
SimpleCov.start 'rails'
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
config.include RSpec::Rails::RequestExampleGroup, type: :request, file_path: /spec\/api\/v1/
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = false
config.infer_spec_type_from_file_location!
Faker::Config.locale = 'pt-BR' …Run Code Online (Sandbox Code Playgroud) 我有一个rails应用程序,我使用Devise对应用程序的用户进行身份验证.
问题是我正在构建一个Android应用程序,我想了解如何在Android上"轻松地"验证用户的流程.我读到了Basic和Digest Auth.
或api我使用Grape https://github.com/intridea/grape,其中包含用于身份验证的Basic和Digest中间件.
我只是想知道我应该在Android应用程序上存储用户的电子邮件/密码吗?
每个api请求都应该附上用户的电子邮件/密码?
另外,在经过身份验证的响应中,我的auth标头的好处是什么?
我正在使用歌利亚和葡萄.在我的巨人服务器上,它调用葡萄api,如下所示:
when '/posts' then FrameworksAPI::API.call(env)
Run Code Online (Sandbox Code Playgroud)
在我的葡萄api课上,我的方法就像这样简单:
get '/:id' do
Post.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)
我想修改标题 - 特别是'Content-Length'但不确定如何.
我还想问一个额外的问题.如何在方法GET返回结果之前专门创建回调/过滤器我想修改结果.
我正在处理一个示例 Ruby/Grape 示例,除了 json 被转义外,一切正常。我也是全新的 ruby 及其框架(仅 3 天),如果这个问题是补救性的,那么很抱歉,并提前感谢您
我相当肯定不应该对引号进行转义,无论如何这里是转义的输出:
"{\"word\":\"test\",\"sentiment\":\"unkown\"}"
Run Code Online (Sandbox Code Playgroud)
我的代码
require 'rubygems'
require 'grape'
require 'json'
class SentimentApiV1 < Grape::API
version 'v1', :using => :path, :vendor => '3scale'
format :json
resource :words do
get ':word' do
{:word => params[:word], :sentiment => "unkown"}.to_json
end
post ':word' do
{:word => params[:word], :result => "thinking"}.to_json
end
end
resource :sentences do
get ':sentence' do
{:sentence => params[:sentence], :result => "unkown"}.to_json
end
end
end
Run Code Online (Sandbox Code Playgroud)
配置文件
$:.unshift "./app"
需要'sentimentapi_v1.rb'
运行 SentimentApiV1
包和版本
C:\Ruby-Projects\GrapeTest>bundle install …Run Code Online (Sandbox Code Playgroud)