2012-01-25 46 views
2

我正在为我的应用程序的api woking。 api是一种可安装的引擎。Rails 3.1可挂载的引擎宝石依赖关系

我的问题是,如果没有在父应用程序gemfile中指定宝石,它们不会在api引擎中加载。

我目前的设置:

parentapp/Gemfile中

gem 'api', :path => 'path/to/api' 

parentapp/routes.rb中

mount Api::Engine => '/api' 

api.gemspec

$:.push File.expand_path("../lib", __FILE__) 

require "api/version" 

Gem::Specification.new do |s| 
    s.name  = "api" 
    s.version  = Api::VERSION 
    s.authors  = ["Author"] 
    s.email  = ["email"] 
    s.homepage = "http://example.com" 
    s.summary  = "Summary" 
    s.description = "Description" 

    s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"] 
    s.test_files = Dir["test/**/*"] 

    # Is not loading. 
    s.add_dependency 'rails', '~> 3.1.3' 
    s.add_dependency 'rabl' 
    s.add_dependency 'yajl-ruby' 
end 

API /测试/虚拟/配置/ routes.rb中

Rails.application.routes.draw do 

    mount Api::Engine => "/api" 
end 

奇怪的是,它越来越 “装”,因为如果我设置

s.add_dependency 'rails', '~> 3.2' 

它提出了一个错误。

Stacktrace如果我从父应用程序gemfile中删除gem 'rabl'

NameError: uninitialized constant Rabl 
~/Sites/api/config/initializers/rabl_init.rb:1:in `<top (required)>' 
~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:556:in `block (2 levels) in <class:Engine>' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:555:in `each' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/engine.rb:555:in `block in <class:Engine>' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:30:in `instance_exec' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:30:in `run' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:55:in `block in run_initializers' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:54:in `each' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/initializable.rb:54:in `run_initializers' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/application.rb:96:in `initialize!' 
    ~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/railtie/configurable.rb:30:in `method_missing' 
    ~/Sites/parentapp/config/environment.rb:5:in `<top (required)>' 
    <internal:lib/rubygems/custom_require>:29:in `require' 
    <internal:lib/rubygems/custom_require>:29:in `require' 
    ~/Sites/parentapp/config.ru:3:in `block in <main>' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/builder.rb:4:in `instance_eval' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/builder.rb:4:in `initialize' 
    ~/Sites/parentapp/config.ru:1:in `new' 
    ~/Sites/parentapp/config.ru:1:in `<main>' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:50:in `eval' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:50:in `load_config' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:43:in `initialize' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:13:in `new' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/lib/nack/server.rb:13:in `run' 
    ~/Library/Application Support/Pow/Versions/0.3.2/node_modules/nack/bin/nack_worker:4:in `<main>' 

这是位于配置/初始化(发动机)我rabl_init.rb文件

Rabl.configure do |config| 
config.include_json_root = false 
end 

如果我删除此文件,我得到Template is missing

Missing template api/v1/myresource/show, api/application/show with {:handlers=>[:erb, :builder, :coffee, :haml], :formats=>[:json] 

的Rabl的处理程序是不包括,ergo,rabl没有加载。

+0

什么告诉你它没有加载?你能发表一些关于症状/错误的更多细节吗? – jipiboily

+0

就像我在问题中所说:'但是如果我从parent_app中删除它,它不起作用。如果gem没有在父应用程序gemfile中指定,它在我的引擎中不可用。 –

+1

我也没有得到你的实际问题是什么...... – phoet

回答

3

我不需要宝石,因为我应该。 在lib/api/engine.rb中加入require "rabl"解决了它。

+0

你可以在Gemfile中做到:'gem'rabl',要求:'rabl'' – Spajus

+0

我很确定Gemfile不会工作,因为主要的应用程序没有看引擎的Gemfile –