Прийом файлу на "борт" в Rails виглядає так
1 2 3 4 5 6 7 |
uploaded_io = [:filename] if uploaded_io.present? File.open(Rails.root.join(path_to_upload, filename), 'wb') do |file| file.write(uploaded_io.read) end end |
У реальному проекту, наприклад для товару потрібно мати картинку, код буде наступним:
У view'і форма має приблизно такий вигляд
1 2 3 |
<%= bootstrap_form_for(@tovar,url: admin_tovars_path) do |f| %> <%= f.file_field :filename,{label: "Файл", prompt: "Виберіть файл"} %> <%= end %> |
У контролері
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
def update @tovar = Tovar.find_by(id: params[:id]) if @tovar.update(tovar_params) file_upload params[:id] flash[:success] = 'Дані успішно збережені' redirect_to admin_tovars_path else flash[:error] = 'Помилка оновлення товару' render :edit end end def file_upload id uploaded_io = params[:tovar][:filename] if uploaded_io.present? file_delete id filename=id.to_s+'_'+uploaded_io.original_filename File.open(Rails.root.join('public', 'uploads','tovars', filename), 'wb') do |file| file.write(uploaded_io.read) end Tovar.update(id,filename: uploaded_io.original_filename) end end def file_delete id tovar=Tovar.find_by(id: id) if tovar.filename.present? file_path = Rails.root.join('public', 'uploads', 'tovars', (id.to_s + '_' + tovar.filename)) if File.file?(file_path) File.delete(file_path) Tovar.update(id,filename: nil) end end end |