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.