Ruby on Rails - Caricamento di file
Potresti avere un requisito in base al quale desideri che i visitatori del tuo sito caricino un file sul tuo server. Rails rende molto facile gestire questo requisito. Ora procederemo con un semplice e piccolo progetto Rails.
Come al solito, iniziamo con una nuova applicazione Rails chiamata testfile. Creiamo la struttura di base dell'applicazione utilizzando il semplice comando rails.
tp> rails new testfile
Prima di iniziare lo sviluppo dell'applicazione, dovremmo installare i file gem come mostrato di seguito -
gem install carrierwave
gem install bootstrap-sass
Apri il tuo gemfile e aggiungi le seguenti due gemme in basso come mostrato nell'immagine seguente:
Dopo aver aggiunto gemme nel file gem, dobbiamo eseguire il seguente comando sulla console:
bundle install
Creazione del modello
Dobbiamo creare un modello con due stringhe come nome e allegato come mostrato di seguito -
rails g model Resume name:string attachment:string
Dobbiamo creare la migrazione del database come mostrato di seguito -
rake db:migrate
Dobbiamo generare il controller come mostrato di seguito -
rails g controller Resumes index new create destroy
Grande! Ora abbiamo la struttura di base impostata. Ora dobbiamo creare un uploader. Un Uploader è arrivato da carrierwave gem e dice a carrierwave come gestire i file. In breve, conteneva tutte le funzionalità di elaborazione dei file. Esegui il comando per creare un uploader come mostrato di seguito
rails g uploader attachment
Ora apri il modello di curriculum e chiama l'uploader come mostrato di seguito. Il modello di ripresa è stato posizionato in 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
Prima di lavorare sul controller, dobbiamo modificare il nostro config / routes.db come mostrato di seguito -
CarrierWaveExample::Application.routes.draw do
resources :resumes, only: [:index, :new, :create, :destroy]
root "resumes#index"
end
Ci consente di modificare il controller come mostrato di seguito.
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
Aggiungiamo l'implementazione bootstrap nel file css file.css potrebbe essere in app / assets / stylesheets / resumes.css.scss
@import "bootstrap";
Ora apri app / views / layouts / application.html.erb e aggiungi i codici come mostrato di seguito -
<!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>
Ora dobbiamo impostare le viste indice come mostrato di seguito:
<% 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>
Ora, modifichiamo new.html.erb e aggiungiamo il nostro codice del modulo.
<% 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>
Ora avvia il server e visita http: // localhost: 3000. Produrrà una schermata simile alla seguente:
Un'ultima cosa che dobbiamo fare è filtrare l'elenco dei tipi di file consentiti. Per questo abbiamo bisogno di aggiungere un semplice codice come mostrato di seguito su 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
Ora avvia il server e visita http: // localhost: 3000. Ora inserisci un formato sbagliato; genererà un messaggio sbagliato come mostrato di seguito -
Per un dettaglio completo su File oggetto, devi passare attraverso il file Ruby Reference Manual.