Ruby on Rails - Téléchargement de fichiers

Vous pouvez avoir une exigence dans laquelle vous souhaitez que les visiteurs de votre site téléchargent un fichier sur votre serveur. Les rails permettent de gérer très facilement cette exigence. Nous allons maintenant procéder à un projet Rails simple et petit.

Comme d'habitude, commençons avec une nouvelle application Rails appelée testfile. Créons la structure de base de l'application en utilisant une simple commande rails.

tp> rails new testfile

Avant de commencer le développement d'applications, nous devons installer les fichiers gem comme indiqué ci-dessous -

gem install carrierwave
gem install bootstrap-sass

Ouvrez votre gemfile et ajoutez les deux gemmes suivantes en bas comme indiqué dans l'image suivante -

Après avoir ajouté des gemmes dans le fichier gem, nous devons exécuter la commande suivante sur la console -

bundle install

Création du modèle

Nous devons créer un modèle avec deux chaînes comme nom et pièce jointe comme indiqué ci-dessous -

rails g model Resume name:string attachment:string

Nous devons créer la migration de la base de données comme indiqué ci-dessous -

rake db:migrate

Nous devons générer le contrôleur comme indiqué ci-dessous -

rails g controller Resumes index new create destroy

Génial! Nous avons maintenant mis en place la structure de base. Nous devons maintenant créer un téléchargeur. Un Uploader est venu du gem carrierwave et il indique à carrierwave comment gérer les fichiers. En bref, il contenait toutes les fonctionnalités de traitement de fichiers. Exécutez la commande pour créer un téléchargeur comme indiqué ci-dessous

rails g uploader attachment

Ouvrez maintenant le modèle de CV et appelez le téléchargeur comme indiqué ci-dessous. Le modèle de CV a été placé dans 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

Avant de travailler sur le contrôleur, nous devons modifier notre config / routes.db comme indiqué ci-dessous -

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

Permet de modifier le contrôleur comme indiqué ci-dessous.

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

Ajoutons l'implémentation de bootstrap dans le fichier css file.css pourrait être dans app / assets / stylesheets / resumes.css.scss

@import "bootstrap";

Ouvrez maintenant app / views / layouts / application.html.erb et ajoutez des codes comme indiqué ci-dessous -

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

Nous devons maintenant configurer les vues d'index comme indiqué ci-dessous -

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

Maintenant, éditons new.html.erb et ajoutons notre code de formulaire.

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

Démarrez maintenant le serveur et visitez http: // localhost: 3000. Il produira un écran similaire à celui-ci -

Une dernière chose que nous devons faire est de filtrer la liste des types de fichiers autorisés. Pour cela, nous devons ajouter un code simple comme indiqué ci-dessous à 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

Démarrez maintenant le serveur et visitez http: // localhost: 3000. Saisissez maintenant un format incorrect; cela générera un mauvais message comme indiqué ci-dessous -

Pour un détail complet sur File objet, vous devez passer par le Ruby Reference Manual.