运行 CarrierWave 和 Sinatra 时未定义的方法连接错误。

Undefined Method Join-error when running CarrierWave and Sinatra.

我正在使用网络框架 Sinatra 尝试 Gentle Introduction to CarrierWave 教程。当我 运行 我的应用程序启动时一切正常,应用程序要求我上传文件,并且没有任何问题。但是,在上传文件时,应用程序向我抛出一个 "undefined method `join' for # String:0x3480d50 "-error.

我在互联网上浏览了一下,发现 issue at github 他们说错误可能是由于 Rack 和 Sinatra 之间的不兼容或安装了 Sinatra 的重复版本。

有人知道发生了什么事吗?

我的uploader_app:

require 'carrierwave'
require 'sinatra'
require 'sqlite3'
require 'sequel'
require 'carrierwave/sequel'

DB = Sequel.sqlite
DB.create_table :uploads do 
    String :file    
end

# uploader
class MyUploader < CarrierWave::Uploader::Base
    storage :file
end

# model
class Upload < Sequel::Model
    mount_uploader :file, MyUploader
end

# sinatra app
get '/' do
     @uploads = Upload.all
     erb :index
end

post '/' do
    upload = Upload.new
    upload.file = params[:image]
    upload.save
    redirect to('/')
end

__END__

@@ index
<!DOCTYPE html>
<html>
    <body>
        <div>
            <form action="/" method="post" enctype="multipart/form-data">
                <input type="file" name="image" />
                <input type="submit" name="submit" value="Upload" />
            </form>
                <% @uploads.each do |upload| %>
                    <img src="<%= upload.file.url %>" />
                <% end %>
        </div>
    </body>
</html>

错误发生在 this line in the Carrierwave Library:

path = encode_path(file.path.gsub(File.expand_path(root), ''))

它失败了,因为 rootnil,所以 File.expand_path(root) 引发了一个错误。我不知道为什么没有设置 root,但以下代码(我从 this answer 修改而来)对我有用:

CarrierWave.configure do |config|
  config.root = settings.root
end

我只是在声明 Sequel class 之后和定义路由之前将其添加到代码中。可能最好将其粘贴在 configure block too. Note that settings.root in the code above is Sinatra's root setting.

这似乎不是由 Rack 1.6.0 和 Sinatra 1.4.5 之间的当前问题引起的,因为那是我 运行,尽管我使用的是 Ruby v2。 1.2 正如我在上面的评论中提到的那样。

根据你的需要,Sinatra 的 root 可能不是放置东西的最佳位置,因为我最终在项目根目录中找到了一个名为 "uploads" 的目录,其中包含文件,但是 config.root 显然需要设置为 something.

希望对您有所帮助。