Добавление загрузки файлов в учебник по Sinatra - PullRequest
1 голос
/ 04 октября 2011

EDIT - «carrierwave» не работает с Sinatra 1.3. Синатра 1.2.7 рулит этот код!


Я изучаю Ruby и только что закончил этот замечательный урок по Sinatra: http://net.tutsplus.com/tutorials/ruby/singing-with-sinatra-the-encore/

Полный рабочий код находится здесь (без Bundler, поэтому требуется установить пару гемов) http://nettuts.s3.amazonaws.com/953_sinatra3/Source.zip

Мне хорошо, я хочу узнать больше! Следующая задача, которую я поставил перед собой, - добавить возможность загрузки файлов в этот учебник, и я в замешательстве. Я хочу использовать Carrierwave и пытаюсь интегрировать его в законченный урок.

Во-первых, мне нужны 'carrierwave' и 'carrierwave-datamapper':

require 'carrierwave'
require 'carrierwave/datamapper'

Затем я создаю новый класс:

class MyUploader < CarrierWave::Uploader::Base    #via a Carrierwave tutorial
  storage :file
end

Добавление в класс Notes:

class Note
include DataMapper::Resource
property :id, Serial
property :content, Text, :required => true
property :complete, Boolean, :required => true, :default => 0
property :created_at, DateTime
property :updated_at, DateTime
property :image, String, :auto_validation => false  # trying to add image uploading
mount_uploader :image, MyUploader                   # trying to add image uploading
end

Добавление к сообщению:

post '/' do
  n = Note.new
  n.content = params[:content]
  n.image = params[:image]      # trying to add image uploading
  n.created_at = Time.now
  n.updated_at = Time.now
  n.upload = 
  if n.save 
    redirect '/', :notice => 'Note created successfully.'
  else
    redirect '/', :error => 'Failed to save note.'
  end
end

Наконец, я добавляю загрузку в форму:

<section id="add">
<form action="/" method="post" enctype="multipart/form-data">
    <textarea name="content" placeholder="Your note&hellip;"></textarea>
    <p><input type="file" name="image" /></p>
    <input type="submit" value="Take Note!">
</form>
</section>

Я получаю эту ошибку:

/gems/carrierwave-0.5.7/lib/carrierwave.rb:107:in `<top (required)>': private method `public' called for Sinatra::Application:Class (NoMethodError)

Но, конечно, если мне не требуется 'carrierwave', я получаю сообщение об ошибке, когда MyUploader пытается унаследовать его ...

Заранее спасибо за любые советы. Я чувствую себя здесь так близко, и все же так далеко!

1 Ответ

2 голосов
/ 05 октября 2011

Похоже, эта ошибка вызвана недавним изменением синатры.Это в журнале изменений для версии 1.3 :

Переименовано :public в :public_folder, чтобы избежать переопределения встроенного в Ruby public метода / ключевого слова.set(:public, ...) все еще возможно, но показывает предупреждение.(Константин Хаазе)

Либо проверьте, есть ли более свежая версия carrierwave, либо используйте предыдущую версию sinatra.

...