我有一个我正在处理的groovy脚本,它使用@Grab注释导入依赖项.此脚本将在IDEA和命令行中运行.但是,在IDE中,导入以红色显示(不可解析),并且不会对如此导入的类进行自动完成.
我通过代理访问公司存储库,该代理已在IDEA中配置为Http代理(模块应该是,并且在我本地的.m2 repo中!)
任何人都有任何想法(没有双关语!)?
我正在使用IntelliJ IDEA 12.5 Ultimate(IU-129.1135),JRE 1.7和Groovy 2.1.6
有没有办法在使用Groovy Grape时打印常春藤输出.
当我使用Grape时,它只是挂在那里直到完成下载所有依赖项.我想知道它正在发生什么以及它正在下载什么.
谢谢,
我很难理解并在API中正确实现用户身份验证.换句话说,我很难理解Grape API与Backbone.js,AngularJS或Ember.js等前端框架的集成.
我试图调整所有不同的方法,并阅读了很多相关内容,但谷歌给我带来了真正糟糕的资源,在我看来,就像关于这个话题没有真正好的文章 - 使用Devise和前端的Rails和用户身份验证框架.
我将描述我目前的支点,我希望你能就我的实施提供一些反馈,并指出我正确的方向.
目前的实施
我有跟随Gemfile的后端Rails REST API(我会故意缩短所有文件代码)
gem 'rails', '4.1.6'
gem 'mongoid', '~> 4.0.0'
gem 'devise'
gem 'grape'
gem 'rack-cors', :require => 'rack/cors'
Run Code Online (Sandbox Code Playgroud)
我当前的实现只有具有以下路由的API(routes.rb):
api_base /api API::Base
GET /:version/posts(.:format)
GET /:version/posts/:id(.:format)
POST /:version/posts(.:format)
DELETE /:version/posts/:id(.:format)
POST /:version/users/authenticate(.:format)
POST /:version/users/register(.:format)
DELETE /:version/users/logout(.:format)
Run Code Online (Sandbox Code Playgroud)
我创建了以下模型user.rb
class User
include Mongoid::Document
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
field :email, type: String, default: ""
field :encrypted_password, type: String, default: ""
field :authentication_token, …Run Code Online (Sandbox Code Playgroud) 我正在使用Gradle编译Groovy项目,但我注意到当我在代码中使用@Grab注释时,我收到以下错误:
$ gradle compile :buildInfo :compileJava UP-TO-DATE :compileGroovy FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileGroovy'. > org/apache/ivy/core/report/ResolveReport
(这里有完整的堆栈跟踪http://pastebin.com/0ty4jNct)
我发现使其工作的唯一方法是将'groovy'和'ivy'模块添加到groovy类路径中,但我想避免这种情况,因为不推荐使用groovy类路径.
这是Gradle bug吗?还是有更好的方法来管理@Grab依赖?
我想为Android应用做一个API.搜索时,我找到了{grape}.我正在学习本教程,但是在启动Rails服务器时遇到问题:
=> Booting WEBrick
=> Rails 4.0.2 application starting in development on http://0.0.0.0:80
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport-4.0.2/lib/act
ive_support/dependencies.rb:464:in `load_missing_constant': Unable to autoload c
onstant Usuarios, expected C:/Sites/appCerca/app/api/v1/usuarios.rb to define it
(LoadError)
Run Code Online (Sandbox Code Playgroud)
我的目录:
app
..api
....api.rb
....v1
......root.rb
......usuarios.rb
Run Code Online (Sandbox Code Playgroud)
和文件:
#application.rb
module AppCerca
class Application < Rails::Application
config.paths.add "app/api", glob: "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
end
end
#routes.rb
AppCerca::Application.routes.draw do
mount API::Root => '/'
[...]
#app/api/root.rb …Run Code Online (Sandbox Code Playgroud) Grape似乎可以很好地为你的类路径添加jar.它还可以执行很多其他操作,例如提取和依赖关系管理.例如
#!/home/robert/bin/groovy
import org.apache.commons.lang.StringUtils
@Grab(group='commons-lang', module='commons-lang', version='2.4')
def strings = ['Hello', 'Groovy', 'AVeryLongWord!', 'A simple sentence']
strings.each { String aString ->
println "$aString: ${StringUtils.abbreviate(aString,10)}"
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我的文件系统上有一个jar,我想动态添加到文件系统,那么我不得不求助于一个更加丑陋的解决方案.
#!/home/robert/bin/groovy
def loader = this.class.classLoader.rootLoader
loader.addURL(new File("/home/robert/somejars/arithmetic-1.1.jar").toURI().toURL())
// can't use traditional package import
arithmeticMainClass = Class.forName("org.scharp.arithmetic.Main")
println "42 - 23 = " + arithmeticMainClass.subtract(42, 23)
// can't use "new" operator
myArithmeticObject = arithmeticMainClass.newInstance()
Run Code Online (Sandbox Code Playgroud)
有没有办法让葡萄从文件系统中抓取一个罐子?如果没有,我可以以某种方式复制葡萄在groovy/java中做的事情吗?
我希望这个解决方案适用于可由许多用户和许多不兼容的jar运行的脚本,因此将jar添加到公共目录(如〜/ .groovy/lib /)将不起作用.
我可以为本地的jar库创建一个本地maven存储库,但这似乎有些过分.
我试图在Groovy 1.6-beta-2中使用新的Groovy Grape功能,但是我收到了一条错误消息;
unable to resolve class com.jidesoft.swing.JideSplitButton
Run Code Online (Sandbox Code Playgroud)
运行stock示例时,从Groovy控制台(/opt/groovy/groovy-1.6-beta-2/bin/groovyConsole);
import com.jidesoft.swing.JideSplitButton
@Grab(group='com.jidesoft', module='jide-oss', version='[2.2.1,)')
public class TestClassAnnotation {
public static String testMethod () {
return JideSplitButton.class.name
}
}
Run Code Online (Sandbox Code Playgroud)
我甚至尝试运行葡萄命令行工具以确保导入库.像这样;
$ /opt/groovy/groovy-1.6-beta-2/bin/grape install com.jidesoft jide-oss
Run Code Online (Sandbox Code Playgroud)
哪个安装库就好了.如何从groovyConsole获取正确运行/编译的代码?
我有一个小型的原型子类Grape::API作为机架服务,并Grape::Entity用于呈现我的应用程序的内部对象.
我喜欢Grape::EntityDSL,但我很难找到我应该超越默认的JSON表示,这对我们来说太轻了.我被要求以"jsend或类似"格式生成输出:http://labs.omniti.com/labs/jsend
我完全不确定改变的性质与Grape框架最相符(我想在这里采用最小阻力路径).我应该创建一个自定义的Grape格式化程序(我不知道如何做到这一点),新的机架中间件(我这样做是为了通过SysLog记录API输入/输出 - 但格式化似乎很糟糕,因为我需要解析正文从JSON返回以添加容器级别),或者更改Grape::Entity为例如RABL?
示例代码("app.rb")
require "grape"
require "grape-entity"
class Thing
def initialize llama_name
@llama_name = llama_name
end
attr_reader :llama_name
end
class ThingPresenter < Grape::Entity
expose :llama_name
end
class MainService < Grape::API
prefix 'api'
version 'v2'
format :json
rescue_from :all
resource :thing do
get do
thing = Thing.new 'Henry'
present thing, :with => ThingPresenter
end
end
end
Run Code Online (Sandbox Code Playgroud)
Rackup文件("config.ru")
require File.join(File.dirname(__FILE__), "app")
run MainService
Run Code Online (Sandbox Code Playgroud)
我启动它:
rackup -p 8090 …Run Code Online (Sandbox Code Playgroud) 我正在使用Grape和Rails来创建REST API.我有基本的架构,我正在寻找"清理"的地方.其中一个地方是错误处理/处理.
我目前正在整个API的root.rb(GRAPE :: API基类)文件中解决错误.我格式化它们然后通过rack_response发回错误.一切正常,但是root.rb文件变得有点臃肿,所有的错误都被拯救了,其中一些有特殊的解析需要完成.我想知道是否有人为错误处理制定了一个好的策略,以便它可以移动到它自己的模块中并使root.rb(GRAPE :: API基类)相当精简.
我真的想创建一个错误处理模块并为每种类型的错误定义方法,例如......
module API
module ErrorHandler
def record_not_found
rack_response API::Utils::ApiErrors.new({type: e.class.name, message: 'Record not found'}).to_json, 404
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后在root.rb文件中执行类似的操作
module API
class Root < Grape::API
prefix 'api'
format :json
helpers API::ErrorHandler
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found # Use the helper method as the handler for this error
end
end
Run Code Online (Sandbox Code Playgroud)
有没有人做过这样的事情?我一直在尝试上述策略的各种风格,但我似乎无法做任何事情.
我在Rails 4.2.1之上使用Grape为我们的应用程序提供API.
但是当我今天检查Newrelic的性能时,我发现RackApp Proc#call并且Grape API::Root#call占用了大量的时间.(见截图)

然后我尝试记录中间件消耗的时间rack_timer,发现ActionDispatch::Routing::RouteSet大部分时间占用了:
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 67.12579727172852 ms
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 101.51457786560059 ms
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 84.18059349060059 ms
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 1236.2565994262695 ms
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 8.124351501464844 ms
Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 55.65309524536133 ms
Run Code Online (Sandbox Code Playgroud)
甚至有些情况需要500毫秒到1000毫秒ActionDispatch::Routing::RouteSet.我怎么能找到这个问题,怎么知道我在Rails路线上做错了什么?
非常感谢您的帮助.
performance ruby-on-rails ruby-grape newrelic ruby-on-rails-4
ruby-grape ×10
groovy ×5
ruby ×3
api ×1
devise ×1
gradle ×1
grails ×1
grape-entity ×1
jar ×1
jsend ×1
newrelic ×1
performance ×1
rest ×1