新手又来提问了:关于rails4.0.0使用grape做api(ruby2.0.0) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
androidBrant

新手又来提问了:关于rails4.0.0使用grape做api(ruby2.0.0)

  •  
  •   androidBrant Aug 25, 2013 5300 views
    This topic created in 4628 days ago, the information mentioned may be changed or developed.
    新建的api文件 app/api/api.rb

    http://gist.github.com/c6eb81aeebe4fa347b3b

    在routes.rb中添加
    mount JokesApi::API => "/"

    修改application.rb



    添加gem gem ‘grape’

    rails s 启动服务器报错,信息如下:

    => Booting WEBrick
    => Rails 4.0.0.rc1 application starting in development on http://0.0.0.0:3000
    => Run `rails server -h` for more startup options
    => Ctrl-C to shutdown server
    Exiting
    /Users/sjwu/Desktop/joke_app/config/routes.rb:5:in `block in <top (required)>': uninitialized constant JokesApi (NameError)
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0.rc1/lib/action_dispatch/routing/route_set.rb:315:in `instance_exec'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0.rc1/lib/action_dispatch/routing/route_set.rb:315:in `eval_block'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0.rc1/lib/action_dispatch/routing/route_set.rb:293:in `draw'
    from /Users/sjwu/Desktop/joke_app/config/routes.rb:2:in `<top (required)>'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:40:in `block in load_paths'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:40:in `each'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:40:in `load_paths'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:16:in `reload!'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:26:in `block in updater'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0.rc1/lib/active_support/file_update_checker.rb:75:in `call'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0.rc1/lib/active_support/file_update_checker.rb:75:in `execute'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:27:in `updater'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/routes_reloader.rb:6:in `execute_if_updated'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application/finisher.rb:69:in `block in <module:Finisher>'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/initializable.rb:30:in `instance_exec'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/initializable.rb:30:in `run'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:150:in `block in tsort_each'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:183:in `block (2 levels) in each_strongly_connected_component'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:219:in `each_strongly_connected_component_from'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:182:in `block in each_strongly_connected_component'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:180:in `each'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:180:in `each_strongly_connected_component'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/tsort.rb:148:in `tsort_each'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/initializable.rb:54:in `run_initializers'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/application.rb:214:in `initialize!'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /Users/sjwu/Desktop/joke_app/config/environment.rb:5:in `<top (required)>' from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/backports-3.3.3/lib/backports/tools.rb:328:in `require_with_backports'
    from /Users/sjwu/Desktop/joke_app/config.ru:3:in `block in <main>'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize'
    from /Users/sjwu/Desktop/joke_app/config.ru:in `new'
    from /Users/sjwu/Desktop/joke_app/config.ru:in `<main>'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `eval'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `new_from_string'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:40:in `parse_file'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:277:in `build_app_and_options_from_config'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:199:in `app'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/commands/server.rb:48:in `app'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:314:in `wrapped_app'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/commands/server.rb:75:in `start'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:80:in `block in <top (required)>'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:75:in `tap'
    from /Users/sjwu/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/railties-4.0.0.rc1/lib/rails/commands.rb:75:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'



    高手帮忙看下,是啥原因,新学rails不久,搞不明白,为什么JokeApi文件没有自己加载?

    谢谢。。。
    12 replies    2014-08-14 18:59:26 +08:00
    androidBrant
        1
    androidBrant  
    OP
       Aug 25, 2013
    第一个app: http://192.157.213.221 想作api来作移动端。搞几天了这错误搞不定。。
    coolzilj
        2
    coolzilj  
       Aug 25, 2013
    @androidBrant 修改`application.rb`文件了么?
    lichao
        3
    lichao  
       Aug 25, 2013 via iPhone
    怎么还是 RC1
    coolzilj
        4
    coolzilj  
       Aug 26, 2013
    @androidBrant 会不会是文件路径的原因,试下改成 app/api/jokes_api/api.rb
    reducm
        5
    reducm  
       Aug 26, 2013 via Android
    routes文件先require一下Api文件
    androidBrant
        6
    androidBrant  
    OP
       Aug 26, 2013
    @coolzilj 修改了
    @coolzilj 路径会有影响吗?config.paths.add "app/api", glob: "**/*.rb"
    config.autoload_paths += Dir["#{Rails.root}/app/api/*"] 这两句是不是对指定的api路径自动require?
    @reducm config.paths.add "app/api", glob: "**/*.rb"
    config.autoload_paths += Dir["#{Rails.root}/app/api/*"]这两句就是对指定的api路径自动require。。。
    androidBrant
        7
    androidBrant  
    OP
       Aug 26, 2013
    @lichao 哪个rc1?有碰到过类似的问题吗?还是有可能的解决办法?
    lichao
        8
    lichao  
       Aug 26, 2013
    @androidBrant 我意思是 Rails 4 早已正式 Release 了,你怎么还用 Release Candidate 1
    coolzilj
        9
    coolzilj  
       Aug 26, 2013
    @androidBrant 是自动require没错,但你没遵守rails里的文件命名惯例
    coolzilj
        10
    coolzilj  
       Aug 26, 2013
    @androidBrant

    任何声明在 autoload paths 的 module 只有在 module 名字和父目录名相同时才会载入。
    举个例子:

    ```ruby

    # lib/my_stuff/bar.rb

    module Foo
    class Bar
    end
    end
    ```
    注意文件名,这样子是不会正确自动载入的,但如果你改成 lib/foo/bar.rb 它就可以了。

    关于autoload背后魔法的详细解释,可以参考这里

    http://stackoverflow.com/questions/3356742/best-way-to-load-module-class-from-lib-folder-in-rails-3?answertab=active#tab-top
    androidBrant
        11
    androidBrant  
    OP
       Aug 26, 2013
    @coolzilj 哦,规则还是强制性的啊,我看看,Thank you
    hlxwell
        12
    hlxwell  
       Aug 14, 2014
    Rails 4 里 app 下的目录都会被加载,但是在 dev 环境下是默认 lazy loaded, 所以你需要手动 require 一下,或者在 routes.rb 顶上加上.

    `Rails.application.eager_load! if Rails.env.development?`

    就搞定了。
    About     Help     Advertise     Blog     API     FAQ     Solana     3578 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 04:54 PVG 12:54 LAX 21:54 JFK 00:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86