#javascript #ruby-on-rails #ruby-on-rails-3 #paperclip #carrierwave
#javascript #ruby-on-rails #ruby-on-rails-3 #скрепка #carrierwave
Вопрос:
Я прочитал эту замечательную статью об использовании скрепки в приложении rails3 для захвата изображений с веб-камеры.
Я пытаюсь преобразовать его для использования Carrierwave (я использую его в других приложениях, которые будут использовать одни и те же изображения, поэтому я хочу быть последовательным).
С чем я борюсь, так это с тем, как заставить Carrierwave принять файл из флэш-изображения, захваченного с jpegcam. Похоже, Paperclip больше ориентирован на файлы, а Carrierwave — на объекты.
Вот что я пытаюсь:
У меня есть модель с установленным на ней средством загрузки carrierwave:
class Individual < ActiveRecord::Base
mount_uploader :picture, PictureUploader
И в представлении (представление «редактировать»):
#webcam
= embed{:id => 'webcam_movie'}... (the embedded flash)...
= submit_tag "Take picture", :onclick => 'webcam.snap();'
= form_for @individual, :html => {:multipart => true} do |f|
= f.text_field :firstname
= f.text_field :lastname
= f.file_field :picture
= f.submit
= content_for :javascripts do
:javascript
function upload_complete(msg) {
if (msg) {
????
} else {
alert('An error occured');
webcam.reset();
}
}
webcam.set_hook('onComplete', 'upload_complete');
Моя проблема в том, что Carrierwave на самом деле не имеет функции ‘upload’, скорее она использует объект model. Итак, я не совсем уверен, что вставить в контроллер, чтобы заставить его принять файл. И как обработать обратный вызов в javascript. (Я попробовал пару вещей, которые мне слишком неловко воспроизводить здесь. Передал объект image на контроллер, но не смог понять, как его обработать)
Кто-нибудь может мне помочь? Спасибо.
Ответ №1:
В итоге я исправил это с помощью огромного взлома.
В моем контроллере я сделал:
def upload
@individual = Individual.find(params[:individual_id])
File.open(upload_path, 'w:ASCII-8BIT') do |f|
f.write request.raw_post
end
@individual.picture = File.open(upload_path)
if @individual.save!
render :text => "ok"
end
end
private
def upload_path # is used in upload and create
file_name = 'temp.jpg'
File.join(::Rails.root.to_s, 'public', 'uploads', file_name)
end
Итак, я записываю изображение в файл, который carrierwave затем считывает. (Конечно, carrierwave также создает временную копию файла).
Это очень некрасиво и, вероятно, оскорбляет всех богов Rails, но это работает.
Я задал вопрос в списке carrierwave, могу ли я вырезать бит временного файла и каким-то образом просто прочитать «request.raw_post» в объекте uploader, но не ясно, смогу ли я.
Комментарии:
1. вы когда-нибудь находили более приятный способ сделать это?
2. Нет, никогда не делал. Но, честно говоря, я перестал искать. Типичный программист, не так ли? Если это сработает, просто используйте это и забудьте об этом 🙂