Ruby on Rails - Mengunggah File

Anda mungkin memiliki persyaratan di mana Anda ingin pengunjung situs Anda mengunggah file di server Anda. Rel membuatnya sangat mudah untuk menangani persyaratan ini. Sekarang kita akan melanjutkan dengan proyek Rails sederhana dan kecil.

Seperti biasa, mari kita mulai dengan aplikasi Rails baru bernama testfile. Mari buat struktur dasar aplikasi dengan menggunakan perintah rel sederhana.

tp> rails new testfile

Sebelum memulai pengembangan aplikasi, kita harus menginstal file gem seperti yang ditunjukkan di bawah ini -

gem install carrierwave
gem install bootstrap-sass

Buka gemfile Anda dan tambahkan dua permata berikut di bagian bawah seperti yang ditunjukkan pada gambar berikut -

Setelah menambahkan permata di file permata, kita perlu menjalankan perintah berikut di konsol -

bundle install

Membuat Model

Kita perlu membuat model dengan dua string sebagai nama dan lampiran seperti yang ditunjukkan di bawah ini -

rails g model Resume name:string attachment:string

Kita perlu membuat migrasi database seperti yang ditunjukkan di bawah ini -

rake db:migrate

Kita perlu membuat pengontrol seperti yang ditunjukkan di bawah ini -

rails g controller Resumes index new create destroy

Bagus! Sekarang kita sudah menyiapkan struktur dasar. Sekarang kita perlu membuat pengunggah. Pengunggah datang dari permata carrierwave dan memberitahu carrierwave cara menangani file. Singkatnya, ini berisi semua fungsi pemrosesan file. Jalankan perintah untuk membuat pengunggah seperti yang ditunjukkan di bawah ini

rails g uploader attachment

Sekarang buka model resume dan panggil pengunggah seperti yang ditunjukkan di bawah ini. Model resume telah ditempatkan di app / models / resume.rb -

class Resume < ActiveRecord::Base
   mount_uploader :attachment, AttachmentUploader # Tells rails to use this uploader for this model.
   validates :name, presence: true # Make sure the owner's name is present.
end

Sebelum mengerjakan controller, kita perlu memodifikasi config / routes.db seperti yang ditunjukkan di bawah ini -

CarrierWaveExample::Application.routes.draw do
   resources :resumes, only: [:index, :new, :create, :destroy]
   root "resumes#index"
end

Memungkinkan kami mengedit pengontrol seperti yang ditunjukkan di bawah ini.

class ResumesController < ApplicationController
   def index
      @resumes = Resume.all
   end
   
   def new
      @resume = Resume.new
   end
   
   def create
      @resume = Resume.new(resume_params)
      
      if @resume.save
         redirect_to resumes_path, notice: "The resume #{@resume.name} has been uploaded."
      else
         render "new"
      end
      
   end
   
   def destroy
      @resume = Resume.find(params[:id])
      @resume.destroy
      redirect_to resumes_path, notice:  "The resume #{@resume.name} has been deleted."
   end
   
   private
      def resume_params
      params.require(:resume).permit(:name, :attachment)
   end
   
end

Mari tambahkan implementasi bootstrap di file css.css file bisa di app / assets / stylesheets / resumes.css.scss

@import "bootstrap";

Sekarang buka app / views / layouts / application.html.erb dan tambahkan kode seperti yang ditunjukkan di bawah ini -

<!DOCTYPE html>
<html>
   
   <head>
      <title>Tutorialspoint</title>
      <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
      <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
      <%= csrf_meta_tags %>
   </head>
   
   <body>
      <div class = "container" style = "padding-top:20px;">
         <%= yield %>
      </div>
   </body>

</html>

Sekarang kita perlu mengatur tampilan indeks seperti yang ditunjukkan di bawah ini -

<% if !flash[:notice].blank? %>
   <div class = "alert alert-info">
      <%= flash[:notice] %>
   </div>
<% end %>

<br />

<%= link_to "New Resume", new_resume_path, class: "btn btn-primary" %>
<br />
<br />

<table class = "table table-bordered table-striped">
   <thead>.
      <tr>
         <th>Name</th>
         <th>Download Link</th>
         <th> </th>
      </tr>
   </thead>
   
   <tbody>
      <% @resumes.each do |resume| %>
         
         <tr>
            <td><%= resume.name %></td>
            <td><%= link_to "Download Resume", resume.attachment_url %></td>
            <td><%= button_to "Delete",  resume, method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #{resume.name}?" %></td>
         </tr>
         
      <% end %>
   </tbody>
   
</table>

Sekarang, mari edit new.html.erb dan tambahkan kode formulir kita.

<% if [email protected]? %>
   <div class = "alert alert-error">
      
      <ul>
         <% @resume.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
         <% end %>
      </ul>
      
   </div>
<% end %>

<div class = "well">
   <%= form_for @resume, html: { multipart: true } do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>
      <%= f.label :attachment %>
      <%= f.file_field :attachment %>
      <%= f.submit "Save", class: "btn btn-primary" %>
   <% end %>
</div>

Sekarang mulai server dan kunjungi http: // localhost: 3000. Ini akan menghasilkan layar seperti berikut -

Satu hal terakhir yang perlu kita lakukan adalah memfilter daftar tipe file yang diizinkan. Untuk itu kita perlu menambahkan kode sederhana seperti yang ditunjukkan di bawah ini di app / uploaders / attachment_uploader.rb

class AttachmentUploader < CarrierWave::Uploader::Base
   storage :file
   
   def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
   end
   
   def extension_white_list
      %w(pdf doc htm html docx)
   end
end

Sekarang mulai server dan kunjungi http: // localhost: 3000. Sekarang masukkan format yang salah; itu akan menghasilkan pesan yang salah seperti yang ditunjukkan di bawah ini -

Untuk detail selengkapnya tentang File objek, Anda harus melalui Ruby Reference Manual.