标签: grape-api

Ruby中的`try`和`&.`(安全导航操作符)有什么区别?

这是我的代码:

class Order < Grape::Entity
  expose :id { |order, options| order.id.obfuscate }
  expose :time_left_to_review do |order, options|
    byebug
    order&.time_left_to_review # ERROR
  end
  expose :created_at { |order, options| order.last_transition.created_at }
end

# NoMethodError Exception: undefined method `time_left_to_review' for #<Order:0x007f83b9efc970>
Run Code Online (Sandbox Code Playgroud)

我认为这&.是一个捷径,.try但我想我错了.可能有人指出我正确的方向,我错过了什么?

我觉得这不是红宝石相关的.葡萄可能吗?虽然我不明白它是怎么回事.

ruby if-statement ruby-on-rails nomethoderror grape-api

21
推荐指数
4
解决办法
1万
查看次数

如果没有正文,4x错误的内容类型应该是什么?

考虑获取以下响应的HTTP请求:

405 Method Not Allowed
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

这样的内容类型应该是什么?

  • 什么都没有?
  • 没有设置?
  • 设为text/plaintext/html

http http-headers grape-api

15
推荐指数
1
解决办法
4818
查看次数

如何在葡萄api应用程序中拆分?

在我看到的每个例子中,人们只实现了一个巨大的api.rb文件.例如:

虽然这种方法可以正常工作,但它很快就会变得拥挤而难以维护,所以我想在我的应用程序上拆分.

例如,我想从我的资源中分割我的实体,然后在不同的文件之间分配我的资源.举些例子:

app
 - api
   api.rb
   - entities
     - weblog.rb
     - post.rb
     - comment.rb
   - resources
     - weblog.rb
     - post.rb
     - comment.rb
Run Code Online (Sandbox Code Playgroud)

现在,api.rb将是这样的:

require 'grape'
module Blog
  class API < Grape::API
    prefix "api"
  end
end
Run Code Online (Sandbox Code Playgroud)

app/api/entities/post.rb会是这样的:

module Blog
  module Entities
    class Post < Grape::Entity
      root 'posts', 'posts'
      expose :id
      expose :content
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

app/api/resources/post.rb会是这样的:

module Blog
  class API < Grape::API
    resource :posts do
      get do
        present Post.all, with: …
Run Code Online (Sandbox Code Playgroud)

api ruby-on-rails-3 grape-api

14
推荐指数
1
解决办法
4931
查看次数

{grape}授权

我正试图在红宝石中创建一个宁静的json api - 所以我在Rack中使用了葡萄(https://github.com/intridea/grape).我没有在这个项目中使用Rails,所以cancan,sorcery等......似乎不是最好的选择.另外,我讨厌将一堆命令式逻辑混合到葡萄的声明性DSL中.

虽然葡萄已经内置了身份验证支持,但我没有看到任何有关授权的信息.看起来这将是一个很常见的用例,这条道路之前已经走过了,但经过谷歌和葡萄代码库本身的一些非常彻底的挖掘后,我什么都没发现.

有没有人为他们的葡萄项目实施这样的东西?你用了什么?

ruby api authorization grape-api

12
推荐指数
2
解决办法
3503
查看次数

混合内容错误nginx入侵kubernetes for rails app

使用Nginx Ingress负载均衡器在GCP中部署Portus.Portus加载得很好,但在尝试使用应用程序并填写一些表单时,我收到以下错误:

VM798:1混合内容:" https://staging.foo.bar/admin/registries/new " 页面是通过HTTPS加载的,但请求了一个不安全的XMLHttpRequest端点" http://staging.foo.bar//api/v1/registries/validate?name = devreg&hostname = staging-foo-barregistry%3A5000&external_hostname =&use_ssl = false&force = false&only%5B%5D = hostname '.此请求已被阻止; 内容必须通过HTTPS提供.

Nginx配置:https://github.com/kubic-project/caasp-services/blob/master/contrib/helm-charts/portus/templates/nginx-configmap.yaml

环境:

  • GCP中的Kubernetes
  • 通过helm部署的所有资源
  • ssl由kube-lego提供
  • 带有Grape API gem的Rails应用程序
  • 葡萄搭载api如下: mount API::RootAPI => "/"

所以我确保检查手动http调用的代码并没有看到任何内容.我花了一天时间试图挖掘rails docs和nginx docs,看看是什么导致某些应用程序正确加载ssl和API不遵循相同的规则

-----更新1 ------经过进一步调查,看起来它与Vue验证器有关.检查开发人员工具显示以下内容:

卷曲' http://staging.foo.bar//api/v1/registries/validate?name=devreg&hostname=st&external_hostname=&use_ssl=false&force=false&only%5B%5D=name'-X选项-H'访问控制请求-Method:获取'-H'来源:https://staging.foo.bar'-H'Access-Control-Request-Headers:x-csrf-token' - 压缩

它看起来像是在这里调用根URL:

javascript:
      window.API_ROOT_URL = '#{root_url}';
Run Code Online (Sandbox Code Playgroud)

如上所述,root_url设置为/.

然而,分析Vue代码更接近狂欢:

Vue.http.options.root = window.API_ROOT_URL;

Vue.http.interceptors.push((_request, next) => {
  window.$.active = window.$.active || 0;
  window.$.active += 1;

  next(() => {
    window.$.active -= 1;
  });
}); …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails nginx grape-api gcp portus

10
推荐指数
1
解决办法
634
查看次数

在Grape/Rack :: Mount :: Route中访问已编译的路由

我正在尝试生成由我的Grape :: API(MyApi)子类生成的所有路由的列表.

我可以致电:

MyApi.send(:route_set).instance_variable_get(:@routes)
Run Code Online (Sandbox Code Playgroud)

这给了我一个Rack :: Mount :: Route对象的数组.

Route对象唯一有用的属性是:返回Hash的条件,如下所示:

 :path_info => (?-mix:\\A\\/api\\/(?<version>v1)\\/token(?:\\.(?<format>[^\\/]+))?\\Z)", "k: request_method, v: (?-mix:\\AGET\\Z)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,哈希值是用于匹配路径路径的正则表达式.我也可以使用:named_captures从regexp获取所有命名的捕获:

{:path_info=>{:version=>0, :format=>1}, :request_method=>{}}
Run Code Online (Sandbox Code Playgroud)

最终我要做的是生成通过Grape :: API创建的所有路由的列表,它们的完整路径等.在条件下尝试解构正则表达式对我没有意义.是否存在另一种访问/生成Rack :: Mount :: Route的可读路径的方法?

rack ruby-on-rails ruby-1.9 grape-api

9
推荐指数
2
解决办法
6448
查看次数

Sinatra和Grape API在一起?

我一直在读书,我发现这个名为Grape的微框架用于红宝石.我目前正在使用Sinatra来处理Web界面,但我还想实现Grape来处理应用程序的API方面.我找不到任何有用的建议来解决这个问题.葡萄文档说"Grape是一个类似REST的API微框架,用于Ruby.它设计用于在Rack上运行,或通过提供简单的DSL来轻松开发RESTful API,从而补充现有的Web应用程序框架,如Rails和Sinatra." 所以听起来应该有正式的两种方式相结合的方式吗?这个应用程序也将在Heroku上运行.

ruby rubygems heroku sinatra grape-api

9
推荐指数
1
解决办法
5324
查看次数

如何使用GRAPE API允许二进制文件下载

我想允许使用ruby的Grape API下载二进制文件(.p12文件).这就是我想要的.

get '/download_file' do
  pkcs12 = generate_pkcsfile 
  content_type('application/octet-stream')
  body(pkcs12.der)
end
Run Code Online (Sandbox Code Playgroud)

使用ActionController的等效代码是

begin
  pkcs12 = generate_pkcsfile
  send_data(pkcs12.der,
            :filename => 'filename.p12')
end
Run Code Online (Sandbox Code Playgroud)

问题是使用API​​下载的文件似乎是一个文本文件,每个字符都嵌入了'\ ufffd'前缀,而使用浏览器下载的文件似乎是二进制文件.如何使用GRAPE API框架允许下载通过ActionController的send_data下载的同一文件

ruby api ruby-on-rails actioncontroller grape-api

8
推荐指数
2
解决办法
5852
查看次数

将每个实体葡萄放在一个文件中

我想在葡萄实体文件中有多个类,这是文件夹结构app/api/proj/api/v2/entities/committees.rb

module PROJ::API::V2::Entities
class Committee < Grape::Entity
expose :id

expose :name, :full_name, :email, :tag, :parent_id

expose :country do |entity, option|
  entity.parent.name if entity.parent.present?
end

# include Urls

private
  def self.namespace_path
    "committees"
  end
end

  class CommitteeWithSubcommittees < CommitteeBase
        # include ProfilePhoto 
        expose :suboffices, with: 'PROJ::API::V2::Entities::CommitteeBase'
      end
Run Code Online (Sandbox Code Playgroud)

在Grape API中

present @committees, with: PROJ::API::V2::Entities::Committee
Run Code Online (Sandbox Code Playgroud)

工作中.但如果我在场

present @committees, with: PROJ::API::V2::Entities::CommitteeList
Run Code Online (Sandbox Code Playgroud)

它不起作用.但是当我将它移动到一个名为committee_list.rb实体内部的新文件时,它会起作用.

entity ruby-on-rails ruby-on-rails-3 grape-api

8
推荐指数
1
解决办法
373
查看次数

Rails 4.2 - Grape - IOError:未打开以供阅读

我正在使用Grape on Rails 4.2构建API.这是GitHub上的回购链接.

在前端,我有一个用EmberJS构建的JavaScript应用程序.这里也是GitHub上回购的链接.

我已经更新了以下宝石,以便我可以按照JSON API标准格式化我的API的响应,这似乎需要更新到Ember 1.13,然后更新到Ember 2.0.

gem "active_model_serializers", '0.10.0.rc2'
gem "grape"
gem "grape-active_model_serializers", :git => 'https://github.com/jrhe/grape-active_model_serializers.git'
Run Code Online (Sandbox Code Playgroud)

之后,当我调用API时出现以下错误:IOError:未打开进行读取

根据我在这里和那里收集的信息,我怀疑这与我格式化JSON的方式存在冲突.

在default.rb中,当我对此行进行注释时,继承所有API控制器的文件:

formatter :json, Grape::Formatter::ActiveModelSerializers
Run Code Online (Sandbox Code Playgroud)

我不再有任何错误,但显然响应没有序列化.

我的问题是:

  • 你知道我怎么能解决这个问题吗?
  • 您是否认为使用Grape在我的Rails应用程序中构建API是相关的?随着Rails 5的到来,使用rails-api并重写整个应用程序并不是更好吗?我的意思是,我刚开始,这可能是正确的时间......

如果您需要更多信息,请与我们联系.

在此先感谢您的帮助.

json ruby-on-rails ember.js grape-api json-api

7
推荐指数
1
解决办法
820
查看次数