Загрузка файла в Rails


Я новичок в rails, и я пишу спокойный сайт, используя технику CRUD. До сих пор я создал три страницы, все из которых позволяют пользователю создавать, редактировать и удалять строки из базы данных. Однако моя четвертая страница должна будет включать форму загрузки файла, но a) я не знаю, как файловая система работает с Rails, поэтому я не знаю, где должны храниться файлы. Файл будет около 100 Кб и не может быть сохранен во временном хранилище, потому что он будет постоянно загружаться. И б) я не знаю, как писать в файл.

было бы здорово, если бы вы могли сказать мне, как сделать то, что я упоминал выше - создать вход для загрузки в форме ввода, а затем записать файл в путь к файлу в отдельном каталоге.

3 57

3 ответа:

В то время как есть много драгоценных камней, которые решают загрузку файлов довольно хорошо (см. https://www.ruby-toolbox.com/categories/rails_file_uploads для списка), rails имеет встроенные помощники, которые позволяют легко свернуть свое собственное решение.

использовать file_field - form helper в вашей форме, и rails обрабатывает загрузку для вас:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

вы будете иметь доступ в контроллере к загруженному файлу следующим образом:

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

Это зависит от сложность того, что вы хотите достичь, но этого вполне достаточно для легкой загрузки файлов/загрузки задач. Этот пример взят из направляющих rails, вы можете перейти туда для получения дополнительной информации:http://guides.rubyonrails.org/form_helpers.html#uploading-files

есть хороший камень специально для загрузки файлов:carrierwave. Если Вики не помогает, то есть nice RailsCast о лучшем способе его использования . Подводя итог, есть поле типа file в формах Rails, которая вызывает диалоговое окно загрузки файла. Вы можете использовать его, но "магия" делается carrierwave камень .

Я не знаю, что вы имеете в виду с "как записать в файл" , но я надеюсь, что это хорошее начало.

сентября 2018

для тех, кто недавно проверял этот вопрос,Rails 5.2+ теперь имеет ActiveStorage по умолчанию, и я настоятельно рекомендую проверить его.

поскольку он является частью основных рельсов 5.2+ теперь, он очень хорошо интегрирован и имеет отличные возможности из коробки (все еще все другие известные драгоценные камни, такие как Carrierwave, Shrine, paperclip,... отлично, но этот предлагает очень хорошие функции, которые мы можем рассмотреть для любых новых рельсов проект)

команда скрепки устарела драгоценный камень в пользу Rails ActiveStorage.

вот страница github для ActiveStorage & множество ресурсов доступны везде

также я нашел это видео чтобы быть очень полезным, чтобы понять особенности Activestorage