Механизм импорта/требования рельсов не работает

Этот вопрос (очень) похож на этот пост, но не дублирует, ИМХО, потому что:

  • мои настройки полностью воспроизводимы (докер)
  • Я использую gem, чтобы установить все явно
  • У меня есть сценарий, «не связанный с рельсами», чтобы «доказать», что драгоценный камень «работоспособен».
  • упомянутый вопрос является "древним" в Интернете (почти 8 лет)

Вот полностью воспроизводимый образ докера рельсового сервера REST API:

FROM ruby
RUN apt-get update
RUN apt-get install vim -y
RUN gem install rails
RUN rails new translator --api --skip-action-mailer --skip-active-record
WORKDIR translator
RUN gem install syntax_tree
COPY routes.rb config
COPY translator_controller.rb app/controllers
COPY test.rb test.rb
COPY primes.rb primes.rb
EXPOSE 3000

Я обычно создаю и запускаю свой образ докера:

$ docker build --tag host.front.rb --file Dockerfile .
$ docker run -p 8012:3000 -d -t --name front.rb host.front.rb
$ docker exec -it front.rb bash

Сначала я проверяю, что драгоценный камень syntax_tree установлен правильно:

$ cat test.rb # <----- independent test file
require "json"
require "syntax_tree"

file = File.open('primes.rb')
content = file.read
file.close

program = SyntaxTree.parse(content)
puts JSON.dump(program)

$ ruby test.rb | head -c 41
{"type":"program","location":[1,0,19,265] # <---- good !

Затем я проверяю, что могу получить доступ к своему док-серверу:

# on docker
$ rails server -b 0.0.0.0
=> Booting Puma
=> Rails 7.1.3.2 application starting in development
< ... omitted for brevity ... >
* Listening on http://0.0.0.0:3000

# my local machine
$ curl -X POST -F "[email protected]" http://127.0.0.1:8012/translator1
>> 247
$ stat --format=%n:%s primes.rb
primes.rb:247 # <----- good ! 

Когда я пробую вторую конечную точку (которая requiresyntax_tree), она терпит неудачу:

$ curl -X POST -F "[email protected]" http://127.0.0.1:8012/translator2
{"status":500,...,"exception":"LoadError: cannot load such file -- syntax_tree

Вот мой translator_controller.rb:

require "json"

class TranslatorController < ApplicationController

  def post_handler_simple

    # get the sent file entity
    source = params["source"]

    # read ruby source code
    file = File.open(source.tempfile)
    content = file.read
    file.close

    # return content length -> works fine !
    render plain: ">> #{content.length()}\n"

 end

  def post_handler

    # get the sent file entity
    source = params["source"]

    # read ruby source code
    file = File.open(source.tempfile)
    content = file.read
    file.close

    # this import doesn't work ...
    require "syntax_tree"

    # parse it
    program = SyntaxTree.parse(content)

    # return AST (json format)
    render plain: JSON.dump(program)

  end

end

И вот мой routes.rb для полноты картины

Rails.application.routes.draw do

  post "/translator1", to: "translator#post_handler_simple"
  post "/translator2", to: "translator#post_handler"

end

🤔 А знаете ли вы, что...
Rails активно использует миграции баз данных для управления изменениями схемы.


63
1

Ответ:

Решено

Я использую драгоценный камень для явной установки всего... RUN gem install синтаксическое_дерево

По умолчанию Rails ничего не знает о драгоценных камнях, которые вы установили локально (через gem install ...).

Сначала я проверяю, что гем синтаксического дерева установлен правильно: ...

У вас нет проблем с test.rb, потому что это чистый файл, не относящийся к Rails Ruby, а локально установленный драгоценный камень был найден ruby_gems.

Ошибка LoadError: невозможно загрузить такой файл — синтаксическое дерево

Если вы хотите, чтобы syntax_tree был доступен в контроллере (или требовали этого оттуда) — определите эту зависимость в проекте Gemfile.