机架错误--LoadError:无法加载此文件

7
尝试完成tekpub架子教程,但遇到以下错误。
Boot Error

Something went wrong while loading app.ru

LoadError: cannot load such file -- haiku

在我尝试运行程序时,与应用程序位于同一目录中的一个名为haiku.rb的文件导致了上述错误。代码如下:

class EnvironmentOutput


  def initialize(app=nil)
    @app = app
  end


  def call(env)
    out = ""

    unless(@app.nil?)
 response = @app.call(env)[2]
 out+=response
end

env.keys.each {|key| out+="<li>#{key}=#{env[key]}</li>"}
["200",{"Content-Type" => "text/html"},[out]]
  end
end

require 'haml'
require 'haiku'

class MyApp
  def call(env)

  poem = Haiku.new.random
  template = File.open("views/index.haml").read
  engine = Haml::Engine.new(template)
  out = engine.render(Object.new, :poem => poem)

   ["200",{"Content-Type" => "text/html"}, out]
  end
end

use EnvironmentOutput
run MyApp.new

我相信这只是一个小错误,因为代码与教程中的代码相同,并且它对他起作用...

谢谢


5
如果您正在使用 Ruby 1.9,您可能想尝试 require './haiku.rb',或将当前目录附加到您的加载路径 ($:.append(File.dirname(__FILE__))),然后执行 require 'haiku' - Frost
谢谢,问题已解决。我应该去哪里查找这些信息呢?是 Rack 文档还是 Ruby 文档? - AFraser
刚刚将我的评论改写成了一个正式的答案。它更加详细了些。 - Frost
1个回答

21
你需要了解 Ruby 加载路径(可以使用 $LOAD_PATH$:)。默认情况下,Ruby 的加载路径包括安装 gem 的位置,这就是为什么你可以执行 require 'haml' 而不必提供 haml gem 所在的完整路径。
当你输入 require 'haiku' 时,你实际上要求 Ruby 在它的加载路径中查找名为 haiku.rb 的文件,而 LoadError 是由于 Ruby 在 $LOAD_PATH (或简写的 $:)列表中的任何目录中都没有找到你的 haiku.rb 文件。
你可以通过以下两种方式之一解决此问题:
1. 将 require 'haiku' 更改为 require File.dirname(__FILE__) + '/haiku.rb',以明确告诉 Ruby 要加载哪个文件。 2. 将当前工作目录添加到你的加载路径中:$:.push(File.dirname(__FILE__)),这样你就可以保留 require 'haiku' 部分。

3
如果您正在使用 Ruby 1.9 版本,您可能还可以查看 require_relative - Frost
我认为 $LOAD_PATH 数组上没有 .append 方法。代码片段中的 #2 应该是 $:.push,还是我理解有误? - Ryan
СйаТў»т«їтЁеТГБуА«уџёсђѓт«Ѓт║ћУ»ЦТў» $:.push ТѕќУђЁ $: <<сђѓТѕЉС╝џТЏ┤Тќ░ТѕЉуџёуГћТАѕсђѓ - Frost
关于$:.push部分的附注,这将把当前目录追加到加载路径的末尾。为了将其前置到加载路径中,请使用unshift而不是push - Frost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接