2013-05-19 2 views
3

Я пытаюсь найти основную загрузку файла с помощью хелпера формы в Rails, используя edge rails guide (я использую rails 4.0.0.rc1 и ruby ​​1.9.3p362) прежде чем я попаду в «Паперклип» или «CarrierWave».Загрузка основного файла в рельсах с помощью формы helper

Я положил метод для загрузки прямо с помощью #create в контроллере, мой план состоял в том, чтобы создать новую запись с столбцом изображения, в котором хранится имя моей загрузки.

Мой #create имеет это:

File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| 
    file.write(uploaded_io.read) 
end 

Когда я следую за направляющие рельсы именно загрузка файлов происходит, я могу увидеть файл в моем public/uploads, но я получаю ошибку кодирования в браузере:
Encoding::UndefinedConversionError
"\x89" from ASCII-8BIT to UTF-8

Параметр \ x89 является точка на суффикс имени файла? т.е.: .png

Я нашел сообщение StackOverflow, в котором говорится, чтобы добавить «b» в File.open, который исправляет ошибку кодирования, но я получаю другую ошибку. Это StackOverflow post покрывает мою ошибку, но я считаю, что следую за решением и все еще имею ошибку.

File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| 
    file.write(uploaded_io.read) 
end 

Я получаю следующий TypeError, но без ошибки кодирования. С другой стороны, загрузка файлов.

TypeError: can't cast ActionDispatch::Http::UploadedFile to string: 

Любые предложения по поводу того, что я делаю неправильно? Было бы хорошо, чтобы увидеть эту работу, прежде чем я перейду к PAPERCLIP или CW

ответ

2

Я понял, что я использовал столбец :image для загрузки, но при загрузке файла :image не :string, что это ActionDispatch::Http::UploadedFile объекта (правильно?). В базе данных поле типа поля :image является :string. Так что я хочу хранить в :image, это uploaded_io.original_filename.

Мое первое решение, чтобы заставить его работать, не использовалось ': image' как f.file_field в форме_for. Вместо этого я назову его :filename, а затем возьму uploaded_io.original_filename с этого объекта и сохраните его в :image, а затем сделайте мое сохранение.

Это уродливое, но оно работает.

uploaded_io = params[:piture][:filename] 
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| 
    file.write(uploaded_io.read) 
end 
@picture.image = uploaded_io.original_filename 

Я все еще немного туманно на file.write (upload_io.read) против File.open (...)

+0

У меня такая же ошибка, используя carrierwave. Есть предположения? – ctilley79

+0

Я еще не проверил несущую волну, извините. – kaplan

+0

Я закончил тем, что использовал paperclip, в котором было гораздо больше рельсов 4 – ctilley79

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