2015-01-23 4 views
2

Я пытаюсь использовать Gentle Introduction to CarrierWave -tutorial с помощью веб-рамки Sinatra. Когда я запускаю свое приложение, он начинается просто отлично, и приложение просит меня загрузить файл, и он делает это без каких-либо проблем. Однако при загрузке файла приложение выдает мне «неопределенный метод« join »для # String: 0x3480d50« -error ».Неопределенный метод Ошибка соединения при работе CarrierWave и Sinatra.

Я немного оглянулся в Интернете, и я нашел это 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> 
+0

Не могли бы вы поделиться с нами трассировкой стека? – iain

+0

@iain Sure [link] (https://gist.github.com/ljnissen/6f65363175ceb16cd97d) Это на самом деле дает мне две ошибки: один NoMethodError, как указано выше, и один «TypeError: не может преобразовать нуль в строку». Буду признателен за любую оказанную помощь. – ljnissen

+0

Ты не сойдешь с ума. Я только что установил его и запустил, получил ту же ошибку. Я запускаю Ruby 2.1.2, и я изолировал драгоценные камни, используя bundler, но все еще не удалось. Я посмотрю, что я могу найти. – iain

ответ

2

ошибка происходит на this line in the Carrierwave Library:

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

Это терпит неудачу, потому что root является nil, так File.expand_path(root) вызывает ошибку. Я не знаю, почему корень не установлен, но следующий код (который я редактировался this answer) работал для меня:

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

Я добавил его в код после объявления класса Sequel и перед определением маршрут. Вероятно, лучше всего вставить его в configure block too. Обратите внимание, что settings.root в приведенном выше коде Sinatra's root setting.

Это, похоже, не вызвано текущими проблемами между Rack 1.6.0 и Sinatra 1.4.5, так как это то, что я выполнял, хотя я на Ruby v2.1.2, как я упоминал в комментариях выше.

В зависимости от того, что вы хотите, root может не быть лучшим местом для размещения вещей, так как я закончил с каталогом в корне проекта, который называется «uploads», в котором были файлы, но config.root явно необходимо установить до что-то.

Надеюсь, что это поможет.

+0

Я думаю, что есть связь с Rack 1.6.0 - Sinatra 1.4.5. Эта проблема возникает в обработчике исключений, поэтому, если вы исправите исходную ошибку (как вы это делаете здесь), ошибка «undefined method join» не появится и не скроет оригинал. – matt

+0

@matt вы правы, я забыл, что вопрос первоначально был о ошибке соединения, а не ошибке типа (хотя он действительно * должен был быть таким образом round :) – iain

+0

Вот и все. Спасибо! – ljnissen

Смежные вопросы