rails导入/require机制失败

问题描述 投票:0回答:1

这个问题(非常)类似于这篇文章,但恕我直言,不是重复的,因为:

  • 我的设置是完全可重现的(docker)
  • 我使用
    gem
    显式安装所有内容
  • 我有一个“非 Rails 相关”脚本来“证明”gem 是“可操作的”
  • 提到的问题在互联网时代是“古老”的(将近8年了)

这是 REST API Rails 服务器的完全可重现的 docker 镜像:

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 镜像:

$ 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
gem 已正确安装:

$ 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 !

然后我验证我可以访问我的 Docker 化服务器:

# 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 ! 

当我尝试第二个端点(

require
syntax_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
ruby-on-rails rubygems
1个回答
0
投票

提前抱歉给出了一个愚蠢的答案。如果我弄错了,请纠正和/或更新您的问题以使其更加准确。

我使用 gem 显式安装所有内容... RUN gem install syntax_tree

默认情况下,

Rails
对您通过
gem install ...
安装的gem一无所知。

首先我确保syntax_tree gem 已正确安装:...

您在

test.rb
中没有任何问题,因为它是一个纯粹的
Ruby
文件,其中
ruby_gems
完成其工作。检查
$:
的值(通过 load 或 require 加载脚本和二进制模块的路径。)与
test.rb
相比,
Rails
上下文具有什么值。

LoadError:无法加载此类文件——syntax_tree

如果您希望

syntax_tree
在控制器中可用(或从那里需要) - 请通过
Gemfile
安装 gem。

© www.soinside.com 2019 - 2024. All rights reserved.