flytning fra bærebølge til ActiveStorage i en Rails app

NJ Pearman
NJ Pearman

Følg

Jun 20, 2018 * 9 min læst

vi bruger Ruby on Rails til at undervise i udvikling af applikationer på epfl-Udvidelsesskolen. Det er en fantastisk ramme, der er solid, afprøvet og betroet og præsenterer en let at følge struktur, når du tager dine første skridt til at lære om internetudvikling.

men det er også en konstant udvikling stykke program, med forbedringer og nye funktioner, der frigives hvert år. En af de seneste tilføjelser til Rails i version 5.2 Er ActiveStorage-funktionen, der tilføjer nem filoverførselsstyring til core Rails-rammen for første gang.

i den første iteration af vores applikationsudviklingsprogram inkluderer vi et emne for at lære at tilføje filoverførsler i en Rails-applikation. Vi bruger Rails 5.1 i programmet dog, og filoverførselsemnet bruger en af de meget anvendte tredjepartsløsninger til tilføjelse af filoverførsler, kaldet Transportbølge. Dette er en solid tredjeparts perle, der giver os mulighed for at implementere filoverførsler i en Rails-app og er i brug i mange virkelige Ruby on Rails — apps-inklusive vores læringsplatform!

men med introduktionen af ActiveStorage bliver disse tredjeparts perler mindre attraktive end denne nye løsning bundtet inde i Skinner. Faktisk, Paperclip, en af de andre populære tredjeparts fil upload perler, har allerede meddelt, at det er forældet til fordel for ActiveStorage. Udviklerne af Paperclip har erkendt, at ActiveStorage er et bedre valg for udviklere og stoppet yderligere arbejde på deres egen perle.

så lad os se specifikt på, hvad der kræves for at flytte fra bærebølge i Skinner 5.1 til ActiveStorage i Skinner 5.2.

applikationen

i programmet til udvikling af internetapplikationer arbejder vi med at opbygge en internetapplikation kaldet My Bucket List. Dette er en app, der giver brugerne mulighed for at oprette og spore oplevelser, som de altid har ønsket at opnå. Brugere kan se, hvad andre mennesker har oprettet og spore dem også. En af funktionerne i appen giver en bruger mulighed for at uploade deres egen avatar, og vi bygger denne funktion for at lære om filoverførsler og vedhæftede filer ved hjælp af bærebølge.

en bruger kan uploade en avatar med denne formular ved hjælp af bærebølge

så lad os først få en hurtig gennemgang af, hvad der er involveret i at tilføje en simpel vedhæftet fil ved hjælp af bærebølge.

bærebølgekonfiguration

for at inkludere bærebølge i et projekt skal vi:

  • Tilføj Bærebølgeperlen til Gemfile.
  • Medtag Bærebølgeadapteren til ActiveRecord i en config initialisator, config/initializers/carrierwave.rb.

og derefter for at tilføje et billede vedhæftet fil til en model, skal vi:

  • Generer en Uploader ved hjælp af rails generate uploader UploaderName.
  • Tilføj en attribut på modellen for at gemme det vedhæftede filnavn for hver post med tilhørende databasemigrering.
  • Rediger værdier i uploaderen, f.eks. placering af upload-lager og standardbillede.
  • brug makroen mount_uploader i modellen til at inkludere den pågældende uploader.
  • Tilføj et filformularfelt, hvor et billede kan uploades.
  • Føj modelattributten til listen over stærke parametre i controlleren, der håndterer formularen, der indeholder filfeltet.

lad os overveje et af disse punkter yderligere: i Bærerbølge er det nødvendigt at tilføje specifikke attributter til enhver model, der skal have en vedhæftet fil. For eksempel vil en User model, der har brug for et avatar billede, der er knyttet til det, have brug for en attribut kaldet :avatar, der er en String. Dette kræver en databasemigrering for at tilføje den underliggende databasekolonne plus oprettelse og montering af en Uploader klasse til den attribut i modellen.

dette er ikke særlig besværligt, men som vi vil se, kræver ActiveStorage meget mindre kode fra sag til sag.

endnu et punkt at fremhæve er, at i min app — My Bucket List — appen-er Overførselsbølge avatar uploader konfigureret med standard simpel fillagring. I ordreord gemmes uploadede billeder et sted inde i mappen public/ i applikationen. Den præcise sti er defineret inden for Uploader – klassen for avataren og er indstillet til "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}". Dette er en sti i forhold til mappen public/, så uploadede billeder er direkte tilgængelige via internetserveren. Dette giver direkte adgang til vedhæftede filer, som vi senere kan kontrastere med ActiveStorage.

opgradering af skinner

før du ser på ActiveStorage, er det nødvendigt at opgradere til Rails 5.2. Dette er en opgave, der kan være ret involveret, afhængigt af kompleksiteten af din ansøgning. Den applikation, jeg bruger her, som vi bygger i vores VADEPROGRAM, er ikke særlig vanskelig at opdatere, men den har stadig brug for en vis omhu og opmærksomhed.

her er hvad jeg gjorde for at opdatere My Bucket List-applikationen fra Rails 5.1 til Rails 5.2.

først oprettede jeg en ny filial i mit git — lager for at isolere opgraderingen-det er vigtigt at kunne gå tilbage til den tidligere arbejdsversion af en app, hvis noget går galt i opgraderingsprocessen!

på den nye gren ændrede jeg versionen af Rails i Gemfile fra '~> 5.1.2' til '~> 5.2.0' og løb derefter bin/bundle update rails — denne kommando henter den nye version af rails og alle de relaterede perler i applikationen. Til min ansøgning var der ingen perle konflikter, men hvis du bruger tredjeparts perler, skal du muligvis løse konflikter mellem forskellige perle versioner på dette tidspunkt!

efter installation af den nye Rails gem, og det er afhængigheder, er det nødvendigt at opdatere selve applikationen. Jeg gjorde dette ved hjælp af bin/bundle exec rails app:update. Denne kommando opdaterer programmatisk alle de nødvendige filer i applikationen til at arbejde med Rails 5.2.

men… denne kommando overskriver ændringer, du har foretaget i din ansøgning, såsom config/routes.rb. Heldigvis spørger kommandoen om at overskrive hver fil, og det er muligt at diff nogen af disse filer under denne proces for at kontrollere, hvad der ville blive overskrevet. Prompten for hver overskrivning er , hvilket betyder:

  • Y for “ja, Overskriv min fil”, og er standardindstillingen, hvis du bare trykker på Enter.
  • n for “nej, Overskriv ikke min fil”
  • a for ” Ja, Overskriv denne fil og overskriv alle andre filer også!”. (Min generelle regel er aldrig brug a).
  • q for “Afslut denne proces”
  • d for “Vis mig forskellene mellem min fil og overskrivningen”
  • h for “Vis mig en liste over hvad Ynaqdh betyder”

i min ansøgning accepterede jeg hver overskrivning med Y undtagen config/routes.rb og config/locales/en.yml. Disse to filer var filer, som jeg havde ændret, og så jeg ønskede at beholde min version, så valgte n.

denne opgraderingsproces kan være mere involveret, hvis du har en mere kompleks applikation, især hvis du har masser af brugerdefineret konfiguration i nogen af miljøkonfigurationsfilerne, dvs. config/environments/production.rb, config/environments/test.rbog config/environments/development.rb. Opgraderingen tilføjer vigtige indstillinger til disse filer, men du vil også beholde din egen brugerdefinerede konfiguration — det er her at have den originale version af applikationen i en separat git-gren hjælper. Det er så muligt at koden i denne gamle gren for at kontrollere, at al din applikationskode og konfiguration stadig er på plads efter opgraderingen.

efter at have kørt bin/bundle exec rails app:update var det nødvendigt for mig at tilføje bootsnapgem til Gemfile. Dette er en ny perle, der bruges i Rails 5.2, men den tilføjes ikke som en del af kommandoen app:upgrade. Så jeg har lige tilføjet gem 'bootsnap' til Gemfileog derefter løb bin/bundle install.

efter dette startede min Bucket List-applikation som før du brugte rails server.

udskiftning af bærebølge med ActiveStorage

så med applikationen, der nu kører på skinner 5.2, kunne jeg begynde at erstatte bærebølge med ActiveStorage.

med ActiveStorage er det unødvendigt at tilføje modelspecifikke attributter for at gemme de vedhæftede filnavne, der er nødvendige med Carrierbølge. ActiveStorage arbejder med de samme to tilknyttede tabeller for alle vedhæftede filer.

for at oprette disse to tabeller løb jeg bin/bundle exec rails active_storage:installefterfulgt af rails db:migrate. De to tabeller er active_storage_blobs og active_storage_attachments; den første er for detaljerne i den vedhæftede fil, og den anden er for den polymorfe jointabel, der forbinder en vedhæftet fil til en modelpost.

og her er det vigtige punkt: når vi først har oprettet disse to tabeller, behøver vi ikke oprette andre migrationer for at inkludere vedhæftede filer i vores modeller! Dette gør ActiveStorage let at arbejde med fra en database perspektiv.

dernæst kiggede jeg på at erstatte implementeringen af :avatar vedhæftet fil med ActiveStorage i stedet for Bærerbølge. I min app har hver User en :avatar. Fordi jeg brugte bærebølge tidligere, havde jeg en :avatar attribut monteret på en bærebølge Uploader i User modellen, erklæret som denne:

class User < ApplicationRecord
# ... various codez mount_uploader :avatar, AvatarUploader # ... other codez
end

bærebølgen :avatar vedhæftet fil kan erstattes med en activesupport vedhæftet fil ved hjælp af has_one_attached :avatar, som denne:

class User < ApplicationRecord
# ... various codez # commented old uploader for reference
# mount_uploader :avatar, AvatarUploader
has_one_attached :avatar # ... other codez
end

det er en ændring til en linje kode. Hvad skal der ellers gøres på dette tidspunkt? For eksempel, hvordan er uploadlagringsplaceringen indstillet? Husk, at i min app er overførselsbølge avatar uploader sat op med standard simple fillagring, og placeringen for dette er eksplicit angivet i avatar_uploader.rb filen. Enkel fillagring er også standard i ActiveStorage. Placeringen er angivet i filen config/storage.yml med en standardværdi for lokale uploads.

standardkonfigurationen for ActiveStorage betyder, at jeg ikke behøver at skrive mere kode til mine uploads for at arbejde for den ændrede :avatar attribut i min ansøgning. Jeg har ændret upload mekanisme helt fra Carrierbølge til ActiveStorage og jeg behøver ikke at gøre noget mere: Jeg behøver ikke foretage ændringer i den Controller, der administrerer uploaden, fordi :avatar allerede er erklæret som en stærk parameter. Og jeg behøver ikke at ændre filformularfeltet i visningen, der giver brugerne mulighed for at vælge et billede, der skal uploades, fordi dette understøttes af “attributten”:avatar.

men der er endnu en ændring, som jeg skal gøre for at migrere fra bærebølge til ActiveStorage, og det er sådan, hvordan man bruger det vedhæftede billede i visninger. Med Carierbølge brugte jeg avatar_url – metoden til at gengive den fulde billedsti. Med ActiveStorage gengives filens URL ikke fra selve vedhæftningsattributten, men gengives ved at overføre attributten til hjælpemetoder. Så den fulde vedhæftede URL kan gengives ved hjælp af url_for(user.avatar) eller direkte med image_tag.

det er også nødvendigt at eksplicit kontrollere, om vedhæftet fil er til stede, så en komplet brug i en visning ville se sådan ud:

<% if current_user.avatar.attached? %>
<%= image_tag current_user.avatar, class: 'avatar' %>
<% else %>
<%= image_tag 'default-avatar', class: 'avatar' %>
<% end %>

når jeg opdaterede henvisningerne til user.avatar_url i mine synspunkter med uddrag som det ovenfor, var jeg flyttet helt fra bærebølge til ActiveStorage for alle nye uploads.

den gamle Bærebølgekode skal ryddes op, og der er et spørgsmål om, hvad man skal gøre med eksisterende uploads, der blev udført med bærebølge. Men se nedenfor om det…

mere komplekse scenarier

næsten alle produktionsscenarier vil være mere komplekse end den, jeg skitserede ovenfor. Det vil være nødvendigt at overveje ting som uploads, der gemmes på CDN ‘ er eller eksterne servere som f.eks. ActiveStorage giver os også mulighed for at gøre mange af disse ting ud af kassen og virker meget godt konstrueret til udviklernes behov. Som du måske forventer, er der god dokumentation i Rails guide.

med hensyn til at migrere eksisterende uploads fra Transportbølge til ActiveStorage, ville dette helt sikkert være muligt med et relativt lille rake script. Jeg vil sigte mod at dække det i et fremtidigt indlæg.

dette var et simpelt scenario, men generelt var jeg virkelig tilfreds med, hvor nemt det var at gøre brug af ActiveStorage og erstatte bærebølge med det. Jeg kan også godt lide tanken, der er gået ind i de forskellige dele af ActiveStorage, da alt ser ud til at være i filer og mapper, der pænt matcher strukturen i resten af Rails. Jeg synes bestemt, det er værd at komme ind i Rails 5.2 for at bruge ActiveStorage til filoverførsler i dine applikationer!

Lær mere!

interesseret i at lære mere om Ruby, og Ruby on Rails? Jeg underviser i udvikling af applikationer på epfl-Udvidelsesskolen, en certificeret online læringsplatform, der underviser i digitale færdigheder inden for datalogi, udvikling af applikationer på internettet og meget mere. EPFL er et af verdens førende universiteter og er rangeret som “nummer 1 ungt Universitet” af Times Higher Education Ranking.



+