运行 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), ''))
它失败了,因为 root
是 nil
,所以 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.
希望对您有所帮助。
我正在使用网络框架 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), ''))
它失败了,因为 root
是 nil
,所以 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.
希望对您有所帮助。