I de to første delene av denne serien viste jeg deg hvordan du aktiverer bildeopplasting i Rails ved hjelp av CarrierWave. I denne delen ser du hvordan du gjør det ved hjelp av Paperclip.
Paperclip er en Ruby perle levert av thoughtbot. Det ble opprettet for å lage filvedlegg veldig enkelt. I denne veiledningen vil du se hvordan du bruker Paperclip ved siden av Devise.
Uten mye snakk, la oss bli opptatt.
Paperclip krever installasjon av ImageMagick på maskinen din. Du trenger dette for bildebehandling. For å installere ImageMagick, bruk ett av trinnene nedenfor, avhengig av hvilken type maskin du bruker.
Mac-brukere:
brygge installasjon imagemagick
Ubuntu brukere:
sudo apt-get install imagemagick
Bruk terminalen din til å generere en ny applikasjon.
skinner nytt papirklipp
Åpne din Gemfile og legg til de nødvendige perlene:
perle 'paperclip'
perle "utarbeide"
Kjør buntinstallasjon når du er ferdig.
Fra terminalen din, installer utfør med kommandoen nedenfor:
skinner generere utforme: installere
Når det er gjort, kan du nå generere brukermodellen din:
skinner genererer utvikle bruker
Overfør databasen din etter.
rake db: migrere
Generer dine utførlige visninger.
skinner genererer utforme: visninger
Bruk tekstredigeringsprogrammet til å navigere til app / visninger / oppsett / application.html.erb
og legg til følgende kode rett over utbytte
blokkere.
# App / visninger / oppsett / application.html.erb<%= notice %>
<%= alert %>
På grunn av sikkerhetsgrunner må vi tillate parametere i Devise-kontrolleren. Takket være det fantastiske laget bak Devise, gjør dette lett.
Åpne opp app / kontrollere / application_controller.rb
og lim inn i følgende kodelinjer.
# app / controllers / application_controller.rb klasse 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
Åpne opp din Bruker
modell og få det til å se slik ut:
# app / models / user.rb klasse bruker < 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
Du må legge til en avatar
kolonne til brukerens tabell. Det er en skinnekommando som gjør dette mulig fra terminalen din.
skinner genererer migrasjon add_avatar_to_users
Det vil skape en ny migrasjon i db / migrerer
. Åpne den og lim inn underkoden:
klasse AddAvatarToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar end end
Kjør overføringen din
rake db: migrere
Du vil redigere din nye form for registrering app / visninger / tenke / registreringer / new.html.erb
og rediger skjemaet app / visninger / tenke / registreringer / edit.html.erb
til det jeg har under:
# App / visninger / tenke / registreringer / new.html.erbMelde deg på
<%= 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 %> tegn minimum) <% 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 / visninger / tenke / registreringer / edit.html.erbRedigere <%= 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 %>For tiden venter bekreftelse på: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (la være tom hvis du ikke vil endre den)
<%= 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 %> (vi trenger ditt nåværende passord for å bekrefte endringene dine)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Avbryt kontoen min
Ulykkelig? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Kikk av nettleseren din og sjekk ut hva du har.
For en standardapplikasjon, vil du kanskje sjekke om en bruker som vil redigere sin profil, allerede har en avatar lastet opp. Dette er enkelt å implementere i din registreringsredigeringsfil.
Åpne registreringsredigeringsfilen og få den til å se slik ut:
# App / visninger / tenke / registreringer / edit.html.erbRedigere <%= 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 %>For tiden venter bekreftelse på: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (la være tom hvis du ikke vil endre den)
<%= 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 %> (vi trenger ditt nåværende passord for å bekrefte endringene dine)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Avbryt kontoen min
Ulykkelig? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Kan du se hva som forandret seg?
I den ovennevnte koden er det et betinget utsagn for å sjekke om en avatar allerede eksisterer for en bruker som bruker linjen <% if @user.avatar? %>
. Hvis dette returnerer sant, blir neste linje kjørt, ellers gjør det ikke.
Validering er alltid viktig når du tillater opplasting av funksjoner i webapplikasjonen din. Paperclip kommer med tiltak for å sikre søknaden din.
Du kan bruke noen av valideringene nedenfor i modellen din.
klassen bruker < 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
Du vil kanskje vurdere Paperclip når du bygger ditt neste webprogram. Den har et flott lag som støtter det.
For å utforske andre funksjoner som ikke er dekket i denne opplæringen, kontrollerer du Paperclips GitHub-side.