Ruby on Rails - Dosya Yükleme

Site ziyaretçilerinizin sunucunuza bir dosya yüklemesini istediğiniz bir gereksiniminiz olabilir. Raylar, bu gereksinimi karşılamayı çok kolaylaştırır. Şimdi basit ve küçük bir Rails projesiyle devam edeceğiz.

Her zamanki gibi, adlı yeni bir Rails uygulamasıyla başlayalım. testfile. Basit rails komutunu kullanarak uygulamanın temel yapısını oluşturalım.

tp> rails new testfile

Uygulama geliştirmeye başlamadan önce, aşağıda gösterildiği gibi gem dosyalarını yüklemeliyiz -

gem install carrierwave
gem install bootstrap-sass

Gemfile'ınızı açın ve aşağıdaki resimde gösterildiği gibi alt tarafa aşağıdaki iki taşı ekleyin -

Gem dosyasına değerli taşlar ekledikten sonra konsolda aşağıdaki komutu çalıştırmamız gerekiyor -

bundle install

Modeli Oluşturmak

Aşağıda gösterildiği gibi ad ve ek olarak iki dizeli bir model oluşturmamız gerekiyor -

rails g model Resume name:string attachment:string

Veritabanı geçişini aşağıda gösterildiği gibi oluşturmamız gerekiyor -

rake db:migrate

Denetleyiciyi aşağıda gösterildiği gibi oluşturmamız gerekiyor -

rails g controller Resumes index new create destroy

Harika! Şimdi temel yapıyı kurduk. Şimdi bir yükleyici oluşturmamız gerekiyor. Bir Yükleyici, carrierwave gem'den geldi ve carrierwave'e dosyaları nasıl kullanacağını söyler. Kısacası, tüm dosya işleme işlevlerini içeriyordu. Aşağıda gösterildiği gibi bir yükleyici oluşturmak için komutu çalıştırın

rails g uploader attachment

Şimdi devam ettirme modelini açın ve yükleyiciyi aşağıda gösterildiği gibi arayın. Özgeçmiş modeli app / models / resume.rb konumuna yerleştirildi -

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

Controller üzerinde çalışmadan önce, config / route.db dosyamızı aşağıda gösterildiği gibi değiştirmemiz gerekiyor -

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

Denetleyiciyi aşağıda gösterildiği gibi düzenlememize izin verin.

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

Css file.css dosyasında bootstrap uygulamasını ekleyelim app / assets / stylesheets / resumes.css.scss olabilir

@import "bootstrap";

Şimdi app / views / layouts / application.html.erb dosyasını açın ve aşağıda gösterildiği gibi kodları ekleyin -

<!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>

Şimdi aşağıda gösterildiği gibi dizin görünümlerini ayarlamamız gerekiyor -

<% 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>

Şimdi new.html.erb'yi düzenleyelim ve form kodumuzu ekleyelim.

<% 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>

Şimdi sunucuyu başlatın ve http: // localhost: 3000 adresini ziyaret edin. Aşağıdakine benzer bir ekran oluşturacaktır -

Yapmamız gereken son bir şey, izin verilen dosya türlerinin listesini filtrelemektir. Bunun için app / uploaders / attachment_uploader.rb adresinde gösterildiği gibi basit bir kod eklememiz gerekiyor.

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

Şimdi sunucuyu başlatın ve http: // localhost: 3000 adresini ziyaret edin. Şimdi yanlış bir format girin; aşağıda gösterildiği gibi yanlış bir mesaj oluşturacaktır -

Hakkında eksiksiz bir ayrıntı için File nesne, geçmeniz gerekiyor Ruby Reference Manual.