2013-08-18 3 views
0

У меня есть высшее приложение уровня, который включает в себя два двигателя:Рельсы: Ссылка двигатель от двигателя

  • Ядро (двигатель)
  • API (двигатель)

API-интерфейс двигателя зависит на модели, присутствующие в двигателе Core. Мне было интересно, как это сделать.


То, что я пытался

Например, если основной двигатель модели «Пользователь», как я ссылаться на него через API движка?

module Api 
describe User do 
routes { Api::Engine.routes } 

before :each do 
    ::Core::User.create! 
end 
.... 

С помощью этого кода, я получил:

Failure/Error: ::Core::User.create! 
NameError: 
    uninitialized constant Core 

Так я думал, что я должен был включать в себя основной двигатель в файле api.gemspec.

s.add_dependency "core", path: "core/" 

Однако, похоже, связка не понравилась.

There was a Gem::Requirement::BadRequirementError while loading 
api.gemspec: 
Illformed requirement [{:path=>"core/"}] from myAppPath/api/api.gemspec:21:in 

Я также попытался

s.add_dependency "core", path: "../core/" 

, но это дало мне подобную ошибку.

Любая идея, что делать, чтобы ссылаться на модели Core от двигателя API?

Спасибо!

Обновление Я попытался добавить двигатель Core в двигатель Api через Gemfile Api. К сожалению, я получаю сообщение об ошибке. Я начинаю чувствовать, что двигатель не должен ссылаться на другие двигатели. Это правда?

/home/.rvm/gems/ruby-2.0.0-p247/gems/railties- 
4.0.0/lib/rails/application/routes_reloader.rb:10:in `rescue in execute_if_updated': 
Rails::Application::RoutesReloader#execute_if_updated delegated to 
updater.execute_if_updated, but updater is nil: # 
<Rails::Application::RoutesReloader:0x007fb53b67bce8 @paths= 
["/home/myApp/api/spec/dummy/config/routes.rb", "/home/myApp/core/config/routes.rb", 
"/home/myApp/api/config/routes.rb"], @route_sets=[# 
<ActionDispatch::Routing::RouteSet:0x007fb53b3b8420>, # 
<ActionDispatch::Routing::RouteSet:0x007fb53b6008b8>, # 
<ActionDispatch::Routing::RouteSet:0x007fb53b6b9b60>]> (RuntimeError) 

UPDATE на выводах В дополнение к приведенному ниже ответ, я хотел бы добавить, что .gemspec файлы не имеют никакой информации о том, где драгоценный камень будет сохранен, то есть он не будет указывать в хранилище Git, или путь к файлу и т.д. Это объясняется в этой статье:

http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

+0

добавить к вашему gem-файлу API, например, «ядро» драгоценного камня, путь: «путь/к/ядро ​​/». –

+0

как в Gemfile? да, я думаю, что это может быть так. Я просто попробовал - получил другую ошибку, но я чувствую, что эта новая ошибка не связана. – Karan

ответ

1

Есть 2 вещи, чтобы понять здесь:

Если ваши двигатели должны быть общедоступными (например, например, Devise engine), то вы захотите ссылаться на свою зависимость Core в gemspec. Вы не сможете ссылаться на него, используя path. Но для общедоступных движков это не вопрос, так как в какой-то момент общественные двигатели будут на Rubygems.

Если ваши двигатели являются частными и используются только для очистки базы кода, то добавление gem 'core', path: '../core' в Gemfile вашего двигателя прекрасное.

Помнить здесь:

  • gemspec для зависимостей декларации (драгоценные камни, ваш двигатель необходим для того, чтобы работать)
  • Gemfile для локальных или испытаний зависимостей декларации
+0

ОК, спасибо за ответ. У меня есть полное приложение для приложения «app», а также движок «api» и «основной» движок, который живет под «приложением». «Api» зависит от ядра ядра, поэтому мне нужно добавить «core» в api.gemspec? Если это так, я не мог заставить его работать. – Karan

+0

Драгоценности «api» и «core» являются частными, поэтому я не опубликовал их на Rubygems (и, следовательно, мне нужно будет использовать путь, но выглядит так: * .gemspec не любит пути ...) – Karan

+0

btw - Я добавил ядро ​​в свой Gemfile, но как только я это сделаю, я получаю некоторую ошибку. Любая идея, что это может быть? – Karan