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…"></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 пытается унаследовать его ...
Заранее спасибо за любые советы. Я чувствую себя здесь так близко, и все же так далеко!