目前做得项目重度使用了 grape-entity, 一边看 wiki, 一边翻源码,写得倒也顺利。但是始终有几个问题解决不好,还请论坛里的高手,分享下自己的经验,谢谢~
主要的问题:
Ruby China 的 grape entity 代码你可以参考下?https://github.com/ruby-china/ruby-china/blob/master/app/grape/entities.rb
频繁报 NameError (uninitialized constant V1::App::Entity::User)
这样的错误。
在 entity.rb
里面定义了
module V1
module App
module Entity
# 用户
class User < Grape::Entity
expose :id, :nick, :avatar
end
end
end
endpoint
定义在 users.rb
文件中,大致的逻辑是这样的:
require_relative "entity"
module V1
module App
class Works < Grape::API
user = User.first
present user, with: Entity::User
end
end
end
在 entity.rb
文件中定义了许多 entity
, 大概像这样:
module V1
module App
module Entity
# 商家
class MerchantSummary < Grape::Entity
expose :id, :name, :address, :logo_path
end
class Merchant < MerchantSummary
expose :rating
end
# 用户
class UserSummary < Grape::Entity
expose :id, :nick, :avatar
end
class User < UserSummary
expose :created_at
end
end
end
end
NameError (uninitialized constant V1::App::Entity::User):
/Users/hacker/work/app/api/v1/app/works.rb:32:in `block (2 levels) in <class:Works>'
/Users/hacker/.rvm/gems/[email protected]/gems/grape-0.9.0/lib/grape/endpoint.rb:45:in `call'
/Users/hacke/.rvm/gems/[email protected]/gems/grape-0.9.0/lib/grape/endpoint.rb:45:in `block in generate_api_method'
# 剩下的删掉了, 基本上没啥用
#6 楼 @42thcoder 你的出错点在 /Users/hackerZhang/work/app/api/v1/app/works.rb 第 32 行嘛 你把那个文件贴上来 应该就可以发现问题了。。
32 行就是下面代码中的 present user, with: Entity::User
require_relative "entity"
module V1
module App
class Works < Grape::API
user = User.first
present user, with: Entity::User
end
end
end
#8 楼 @42thcoder 在这种情况下,你尝试下替换成 ::V1::App::Entity::User 是不是就对了,如果对的话,就逐一削减搜索条件直到错误为止。 蛮奇怪的,我本地试类似代码都没有问题。
#10 楼 @42thcoder 其实写 Ruby 你不用思考这么多 不用瞎猜 也不用整个人都不好 直接 Debug 就可以。
require_relative "entity"
module V1
module App
class Works < Grape::API
user = User.first
require 'pry'; binding.pry unless defined?(::V1::App::Entity::User)
present user, with: Entity::User
end
end
end
加pry-byebug
,只要代码在断点处停下 就可以通过研究那一刻的 $LOADED_FEATURES
,来看那个文件是否已经加载。如果没加载,研究为什么之前的require_relative
没有出错,它到底加载了那个文件,这样就可以了。
@iBachue pry 真是神器,谢谢~
文件已经加载了,但没找到类。
[25] pry(V1::App::Entity):3> $LOADED_FEATURES.select{|file| file.include? 'entity' }
=> ["/Users/hacker/.rvm/gems/[email protected]/gems/pry-0.10.1/lib/pry/commands/ls/ls_entity.rb",
"/Users/hacker/work/app/api/v1/app/entity.rb"]
[26] pry(V1::App::Entity):3> ls
constants: Product
locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_
/Users/hacker/work/app/api/v1/app/entity.rb
这个文件是对的.
找到那个类Product
, 是在 API 文件products.rb
中直接定义的。
#12 楼 @42thcoder 那就更加神奇了 一个文件被加载过 定义的类却不见了 你可以尝试再次加载 看看有没有出现,如果出现就表示之前哪里把定义的类删掉了。如果没有出现,你检查是不是代码里有错别字神马的。。。