Nelle prime due parti di questa serie, ti ho mostrato come abilitare il caricamento delle immagini in Rails usando CarrierWave. In questa parte, vedrai come farlo usando Paperclip.
Paperclip è una gemma Ruby fornita da thoughtbot. È stato creato per rendere molto semplice l'aggiunta di file. In questo tutorial, vedrai come usare Paperclip insieme a Devise.
Diamo molto da fare, senza molte parole.
Paperclip richiede l'installazione di ImageMagick sul tuo computer. Ne hai bisogno per l'elaborazione delle immagini. Per installare ImageMagick, utilizzare uno dei passaggi seguenti, a seconda del tipo di macchina che si utilizza.
Utenti Mac:
brew install imagemagick
Utenti di Ubuntu:
sudo apt-get install imagemagick
Usa il tuo terminale per generare una nuova applicazione.
rotaie nuova graffetta
Apri il tuo Gemfile e aggiungi le gemme necessarie:
gemma "graffetta"
gemma 'escogita'
Esegui installazione bundle quando hai finito.
Dal tuo terminale, installa idea usando il comando seguente:
i binari generano escogitare: installa
Quando ciò è fatto, puoi ora generare il tuo modello utente:
le rotaie generano l'utente elaborato
Migrare il database dopo.
rake db: migrate
Genera le tue visualizzazioni di idee.
i binari generano escogitare: viste
Usando il tuo editor di testo, vai a app / views / layout / application.html.erb
e aggiungi il seguente codice appena sopra il dare la precedenza
bloccare.
# App / views / layout / application.html.erb<%= notice %>
<%= alert %>
Per motivi di sicurezza, dobbiamo consentire i parametri nel controller Devise. Grazie al fantastico team di Devise, fare questo è facile.
Aprire app / controllers / application_controller.rb
e incollare le seguenti righe di codice.
# app / controller / application_controller.rb class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me, :avatar, :avatar_cache) devise_parameter_sanitizer.for(:account_update) |u| u.permit(:username, :password, :password_confirmation, :current_password, :avatar) end end
Apri il tuo Utente
modella e fallo apparire così:
# app / models / user.rb class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_attached_file :avatar, styles: medium: "300x300", thumb: "100x100" validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ end
Devi aggiungere un avatar
colonna nella tabella Utenti. C'è un comando di rotaie che lo rende possibile dal tuo terminale.
le rotaie generano la migrazione add_avatar_to_users
Ciò creerà una nuova migrazione in db / migrate
. Aprilo e incolla il seguente codice:
classe AddAvatarToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar end end
Esegui la tua migrazione
rake db: migrate
Potrai modificare il tuo nuovo modulo di registrazione app / views / ideare / iscrizioni / new.html.erb
e modifica il modulo app / views / ideare / iscrizioni / edit.html.erb
a ciò che ho di seguito:
# App / views / ideare / iscrizioni / new.html.erbIscriviti
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: multipart: true ) do |f| %> <%= devise_error_messages! %><%= f.label :email %>
<%= f.email_field :email, autofocus: true %><%= f.label :password %> <% if @minimum_password_length %> (<%= @minimum_password_length %> caratteri minimi) <% end %>
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %><%= f.submit "Sign up" %><% end %> <%= render "devise/shared/links" %>
# App / views / ideare / iscrizioni / edit.html.erbmodificare <%= resource_name.to_s.humanize %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put ) do |f| %> <%= devise_error_messages! %><%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<%= f.email_field :email, autofocus: true %>Conferma attualmente in attesa di: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (lascia vuoto se non vuoi cambiarlo)
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %><%= f.label :current_password %> (abbiamo bisogno della tua password corrente per confermare le modifiche)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Cancellare il mio account
Infelice? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Dai un calcio al tuo browser e controlla quello che hai.
Per un'applicazione standard, potresti voler controllare se un utente che desidera modificare il proprio profilo ha già caricato un avatar. Questo è facile da implementare nel file di modifica della registrazione.
Apri il file di modifica della registrazione e rendilo simile a questo:
# App / views / ideare / iscrizioni / edit.html.erbmodificare <%= resource_name.to_s.humanize %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put ) do |f| %> <%= devise_error_messages! %><%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<%= f.email_field :email, autofocus: true %>Conferma attualmente in attesa di: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (lascia vuoto se non vuoi cambiarlo)
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %> <% if @user.avatar? %> <%= image_tag @user.avatar.url(:thumb) %> <% end %><%= f.label :current_password %> (abbiamo bisogno della tua password corrente per confermare le modifiche)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Cancellare il mio account
Infelice? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Riesci a vedere cosa è cambiato?
Nel codice precedente, esiste un'istruzione condizionale per verificare se un avatar esiste già per un utente che utilizza la linea <% if @user.avatar? %>
. Se restituisce true, viene eseguita la riga successiva, altrimenti non lo fa.
La convalida è sempre importante quando si abilitano le funzioni di caricamento nella propria applicazione web. Paperclip viene fornito con misure per proteggere la vostra applicazione.
Puoi utilizzare una delle convalide qui sotto nel tuo modello.
utente di classe < ActiveRecord::Base has_attached_file :avatar # Validate content type validates_attachment_content_type :avatar, content_type: /\Aimage/ # Validate filename validates_attachment_file_name :avatar, matches: [/png\Z/, /jpe?g\Z/] # Explicitly do not validate do_not_validate_attachment_file_type :avatar end
Potresti prendere in considerazione Paperclip mentre costruisci la tua prossima applicazione web. Ha un grande team che lo supporta.
Per esplorare altre funzionalità non trattate in questo tutorial, controlla la pagina GitHub di Paperclip.