Подключение вычислительной задачи к RoR


#1

Есть вычислительная программа, написанная на ruby. На входе массив данных, на выходе HTML страница с результатом вычислений. Текущая задача: подключить эту программу к сайту, написанному на RoR.
Видимый путь решения задачи. Оформить вычислительную программу как модуль, поместить её код в папку Vendor и вызвать в контроллере метод из модуля. Решение задачи осуществляется на модели
файл - ‘calculator.rb’; module Calculator; метод - def acts_as_calculate(…) .

Чтобы вызвать из RoR нужный метод пытаюсь уведомить рельсы вызовом оператора
require ‘vendor/plugin/calculator.rb’ из Gemfile.
На что получаю ошибку при включении сервера:
"There was an error parsing Gemfile: cannot load such file – vendor/plugin/calculator.rb. Bundler cannot continue."
Если пытаюсь подключить модуль из реализации контроллера
require ‘…/…/vendor/plugin/calculator.rb’
то ошибку получаю в момент обращения к этому контроллеру
’LoadError in ArticlesController#create
cannot load such file – …/…/vendor/plugin/calculator.rb’

Перенос вычислительной задачи в RoR не представляется возможным, потому что в ней свыше 10 000 строк кода.

И как тогда решить задачу подключения вычислительной программы к рельсам?


(Vladimir Markovnin) #2

вызывать через %x() ?


#3

реквайрить не нужно. пусть рельса сама занимается автолоадом. ибо у нее для этого целая экосистема.
почитайте о eager_load* autoload* и посмотрите на проблемы автолоада в статейке http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/


#4

и, собственно, require_relative, раз уж на то пошло)


#5

Помогло добавление в config/application.rb пути

config.autoload_paths += %W( #{config.root}/vendor/plugin )


(j2FunOnly) #6

Вы в каком веке?

Rails 4 will be removing Rails::Plugins class. Therefore, any code in the vendor/plugins directory won’t be loaded.
Most apps were already relying on gems instead of vendored plugins. However, if you still have any code in vendor/plugins, you have 2 options:

  • Move it to a gem. Most plugins should already have a gem version. If not, you can reference it from your Gemfile via the :git or :path options.
  • Move it to lib/your_plugin and require it from an initializer on config/initializers.