siirtyminen Carrierwavesta Aktivistiajoon Rails-sovelluksessa

NJ Pearman
NJ Pearman

seuraa

Jun 20, 2018 * 9 min Lue

Ruby on Railsin avulla opetamme web-sovelluskehitystä EPFL Extension Schoolissa. Se on hyvä kehys, joka on vankka, kokeiltu ja luotettu ja esittelee helppo seurata rakenne, kun otat ensimmäiset askeleet oppia web-kehitystä.

, mutta se on myös jatkuvasti kehittyvä ohjelmisto, jonka parannuksia ja uusia ominaisuuksia julkaistaan joka vuosi. Yksi uusimmista lisäyksistä railsiin versiossa 5.2 on ActiveStorage-ominaisuus, joka lisää helpon tiedostojen lataamisen hallinnan core Rails-kehykseen ensimmäistä kertaa.

web-sovelluskehitysohjelmamme ensimmäisessä iteraatiossa sisällytämme kohteen oppiaksemme tiedostojen lataamisen Rails-sovellukseen. Käytämme ohjelmassa kuitenkin Rails 5.1: tä, ja tiedostojen latauskohde käyttää yhtä laajalti käytettyä kolmannen osapuolen ratkaisua tiedostojen lataamiseen, nimeltään CarrierWave. Tämä on vankka kolmannen osapuolen helmi, jonka avulla voimme toteuttaa tiedostojen latauksia Rails-sovelluksessa, ja se on käytössä monissa reaalimaailman Ruby On Rails-sovelluksissa — mukaan lukien learner-alustamme!

mutta Activestoragen käyttöönoton myötä nämä kolmannen osapuolen jalokivet muuttuvat vähemmän houkutteleviksi kuin tämä uusi ratkaisu, joka on niputettu kiskojen sisään. Itse asiassa Paperclip, yksi toinen suosittu kolmannen osapuolen tiedostojen lataus helmiä, on jo ilmoittanut, että se on vanhentunut hyväksi ActiveStorage. Paperclipin kehittäjät ovat tunnustaneet, että ActiveStorage on parempi valinta kehittäjille ja lopettaneet lisätyöt Oman jalokivensä parissa.

joten katsotaanpa tarkemmin, mitä vaaditaan siirtymiseen Rails 5.1: n Carrierwavesta Rails 5.2: n aktiiviseen käyttöön.

sovellus

verkkosovellusten kehitysohjelmassa työskentelemme rakentamalla oma Bucket List – nimisen verkkosovelluksen. Tämä on sovellus, jonka avulla käyttäjät voivat luoda ja seurata kokemuksia, että he ovat aina halunneet saavuttaa. Käyttäjät voivat nähdä, mitä muut ihmiset ovat luoneet ja seurata niitä liian. Yksi sovelluksen ominaisuuksista antaa käyttäjälle mahdollisuuden ladata oman avatarinsa, ja me rakennamme tämän ominaisuuden oppiaksemme tiedostojen latauksista ja liitteistä Carrierwaven avulla.

käyttäjä voi ladata avatarin tällä lomakkeella, käyttäen Carrierwavea

joten ensin, käydään nopeasti läpi, mitä liittyy yksinkertaisen liitteen lisäämiseen Carrierwaven avulla.

CarrierWave configuration

jotta CarrierWave voidaan sisällyttää projektiin, meidän on:

  • lisää Karrierwave helmi Gemfile.
  • Sisällytä Activerecordin CarrierWave-sovitin config-alustajaan, config/initializers/carrierwave.rb.

ja sitten lisätäksemme kuvanliitteen malliin, tarvitsemme:

  • luo lataaja käyttäen rails generate uploader UploaderName.
  • lisää attribuutti malliin tallentaaksesi liitteenä olevan tiedostonimen kullekin tietueelle ja siihen liittyvän tietokannan siirron.
  • muokkaa lataajan arvoja, kuten lataustilan sijaintia ja oletuskuvaa.
  • käytä mallissa mount_uploader makroa sisällyttääksesi tietyn lataajan.
  • lisää tiedostomuotokenttä, johon kuvan voi ladata.
  • lisää malli-attribuutti tiedostokentän sisältävää lomaketta käsittelevän ohjaimen vahvojen parametrien luetteloon.

tarkastellaan vielä yhtä näistä seikoista: Carrierwavessa on tarpeen lisätä tiettyjä attribuutteja mihin tahansa malliin, johon on liitettävä tiedosto. Esimerkiksi User malli, joka tarvitsee siihen liitetyn avatar kuvan, tarvitsee attribuutin :avatar, joka on String. Tämä edellyttää tietokantasiirtymää taustalla olevan tietokanta-sarakkeen lisäämiseksi sekä Uploader – luokan luomista ja asentamista kyseiseen ominaisuuteen mallissa.

tämä ei ole erityisen työlästä, mutta kuten näemme, ActiveStorage vaatii paljon vähemmän koodia tapauskohtaisesti.

vielä yksi korostettava seikka on se, että sovelluksessani — oma Bucket List — sovelluksessa-CarrierWave avatar-uploader on asetettu oletusarvoisesti yksinkertaiseen tiedostotallennukseen. Ladatut kuvat tallennetaan järjestyssanoissa jonnekin sovelluksen public/ – kansion sisälle. Tuo tarkka polku on määritelty avatarin Uploader – luokassa, ja sen arvo on "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}". Tämä on polku suhteessa public/ – kansioon siten, että ladatut kuvat ovat suoraan käytettävissä WWW-palvelimen kautta. Tämä mahdollistaa suoran pääsyn liitetiedostoihin, joita voimme verrata ActiveStorage myöhemmin.

kiskojen parantaminen

ennen kuin tarkastellaan Aktivointirajoitusta, on tarpeen päivittää kiskot 5.2: een. Tämä on tehtävä, joka voi olla melko mukana, riippuen monimutkaisuus hakemuksen. Sovellus, jota käytän tässä, jonka rakennamme WAD-ohjelmassamme, ei ole erityisen vaikea päivittää, mutta se tarvitsee silti hoitoa ja huomiota.

näin päivitin Oman Bucket List-sovelluksen Rails 5.1: stä Rails 5.2: een.

loin ensin uuden haaran git-tietovarastooni eristääkseni päivityksen-on tärkeää pystyä palaamaan sovelluksen edelliseen työversioon, jos jokin menee vikaan päivitysprosessissa!

uudella haaralla vaihdoin Gemfile: n Rails — version '~> 5.1.2': stä '~> 5.2.0': iin ja sitten juoksin bin/bundle update rails – tämä komento lataa rails: n uuden version ja kaikki siihen liittyvät Helmet sovelluksessa. Sovelluksessani ei ollut jalokivikonflikteja, mutta jos käytät kolmannen osapuolen jalokiviä, saatat joutua ratkaisemaan eri jalokiviversioiden väliset ristiriidat tässä vaiheessa!

uuden Rails-jalokiven ja sen riippuvuuksien asentamisen jälkeen on tarpeen päivittää itse sovellus. Tein tämän käyttämällä bin/bundle exec rails app:update. Tämä komento päivittää ohjelmallisesti kaikki sovelluksen tarvittavat tiedostot toimiakseen Rails 5.2: n kanssa.

mutta … tämä komento korvaa sovellukseesi tehdyt muutokset, kuten config/routes.rb. Onneksi komento kysyy, korvataanko jokainen tiedosto, ja on mahdollista diff mikä tahansa näistä tiedostoista tämän prosessin aikana tarkistaa, mitä korvattaisiin. Jokaisen ylikirjoituksen kehote on , mikä tarkoittaa:

  • Y ”Yes, overwrite My file”, ja on oletusvaihtoehto, jos vain painat Enter.
  • n varten ”ei, älä korvaa tiedostoani”
  • a for ” kyllä, korvaa tämä tiedosto ja korvaa kaikki muut tiedostot liian!”. (Yleinen sääntöni on, että älä koskaan käytä a).
  • q for ”Quit this process”
  • d for ”Näytä minulle erot tiedostoni ja korvaa”
  • h for ”Show me a list of what Ynaqdh means”

hyväksyin hakemuksessani jokaisen ylikirjoituksen, jossa on Y paitsi config/routes.rb ja config/locales/en.yml. Ne kaksi tiedostoa olivat tiedostoja, joita olin muuttanut ja siksi halusin pitää versioni, joten valitsin n.

tämä päivitysprosessi saattaa olla enemmän mukana, jos sinulla on monimutkaisempi sovellus, varsinkin jos sinulla on paljon mukautettuja asetuksia missä tahansa ympäristön asetustiedostossa, ts. config/environments/production.rb, config/environments/test.rb ja config/environments/development.rb. Päivitys lisää tärkeitä asetuksia näihin tiedostoihin, mutta haluat myös säilyttää omat mukautetut määrityksesi — tässä auttaa sovelluksen alkuperäisen version pitäminen erillisessä git-haarassa. Se on sitten mahdollista koodin tässä vanhassa haara tarkistaa, että kaikki sovelluksen koodi ja kokoonpano on edelleen paikallaan päivityksen jälkeen.

juostuani bin/bundle exec rails app:update minun oli pakko lisätä bootsnap helmi Gemfile: ään. Tämä on uusi helmi, jota käytetään Rails 5.2: ssa, mutta sitä ei ole lisätty osana app:upgrade – käskyä. Niinpä vain lisäsin gem 'bootsnap' Gemfile ja juoksin sitten bin/bundle install.

tämän jälkeen Bucket List-sovellukseni käynnistyi kuten ennen rails server: n käyttöä.

Carrierwaven korvaaminen Activestoragella

joten, kun sovellus nyt toimii raiteilla 5.2, voisin alkaa korvata Carrierwaven Activestoragella.

Activestoragella on tarpeetonta lisätä mallikohtaisia attribuutteja, jotta carrierwavella tarvittavat liitetiedostonimet voidaan tallentaa. ActiveStorage toimii samoilla kahdella liitetaulukolla kaikille liitteille.

näiden kahden taulukon perustamiseksi juoksin bin/bundle exec rails active_storage:install, jota seurasi rails db:migrate. Kaksi taulukkoa ovat active_storage_blobs ja active_storage_attachments; ensimmäinen koskee liitteenä olevan tiedoston yksityiskohtia ja toinen polymorfista liitostaulukkoa, joka yhdistää liitetyn tiedoston mallitietueeseen.

ja tässä on tärkeä pointti: kun olemme luoneet nuo kaksi taulukkoa, meidän ei tarvitse luoda muita muuttoliikkeitä, jotta voimme sisällyttää liitteitä malleihimme! Tämä tekee ActiveStorage helppo työskennellä tietokantanäkökulmasta.

seuraavaksi pohdin :avatar – liitteen toteutuksen korvaamista aktiivimallilla Karrierwaven sijaan. Sovelluksessani jokaisella User on :avatar. Koska käytin aiemmin Karrierwavea, minulla oli :avatar – attribuutti asennettuna Karrierwavelle Uploader User – mallissa, julistettuna näin:

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

Karrierwave :avatar – liite voidaan korvata aktiivisella tukiliitännällä käyttämällä has_one_attached :avatar, näin:

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

se on muutos yhteen koodiriviin. Mitä muuta tässä vaiheessa on vielä tehtävä? Esimerkiksi, miten on upload tallennuspaikka asetettu? Muista, että sovelluksessani, CarrierWave avatar uploader on määritetty oletuksena yksinkertainen tiedostojen tallennus, ja sijainti Tämä on nimenomaisesti asetettu avatar_uploader.rb tiedosto. Yksinkertainen tiedostojen tallennus on oletuksena myös ActiveStorage. Sijainti on asetettu config/storage.yml – tiedostossa, jossa on oletusarvo paikallisille latauksille.

Activestoragen oletusasetus tarkoittaa, että minun ei tarvitse enää kirjoittaa koodia latauksilleni toimiakseni muokatulle :avatar – attribuutille sovelluksessani. Olen muuttanut lataus mekanismi kokonaan CarrierWave ActiveStorage ja minun ei tarvitse tehdä mitään muuta: Latausta hallinnoivaan ohjaimeen ei tarvitse tehdä muutoksia, sillä :avatar on jo julistettu vahvaksi parametriksi. Eikä minun tarvitse muuttaa tiedostomuotokenttää siinä näkymässä, jossa käyttäjät voivat valita ladattavan kuvan, koska tätä tukee :avatar ”attribuutti”.

mutta on vielä yksi muutos, että minun täytyy tehdä siirtyä CarrierWave ActiveStorage, ja se on miten käyttää oheista kuvaa näkymissä. Carierwavella käytin avatar_url – menetelmää koko kuvapolun renderöintiin. Activestoragessa tiedoston URL-osoitetta ei renderöidä itse attachment-attribuutista, vaan renderöidään siirtämällä attribuutti helper-menetelmiin. Koko liitetiedoston URL-osoite voidaan siis renderoida käyttämällä url_for(user.avatar) tai suoraan numerolla image_tag.

on myös tarpeen erikseen tarkistaa, onko liite mukana, joten täydellinen käyttö näkymässä näyttäisi tältä:

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

kun päivitin viittaukset user.avatar_url minun näkemyksiä pätkiä kuin että edellä, olin siirtynyt kokonaan CarrierWave ActiveStorage kaikki uudet lataukset.

vanha Karrierwave-koodi on siistittävä, ja on kysymys siitä, mitä tehdä olemassa oleville latauksille, jotka tehtiin Carrierwavella. Mutta katso tästä alla …

monimutkaisemmat skenaariot

lähes kaikki tuotantoskenaariot ovat monimutkaisempia kuin edellä kuvaamani. Se ’ ll on tarpeen harkita asioita, kuten Latauksia tallennetaan CDNs tai etäpalvelimia, kuten AWS S3, ja kuvan koon pienoiskuvien, jne. ActiveStorage antaa meille mahdollisuuden tehdä paljon näitä asioita laatikosta liian ja näyttää erittäin hyvin suunniteltu kehittäjien tarpeisiin. Kuten arvata saattaa, kisko-oppaassa on hyvä dokumentaatio.

mitä tulee olemassa olevien latausten siirtämiseen Carrierwavesta Activestorageen, tämä olisi varmasti mahdollista suhteellisen pienellä rake-skriptillä. Aion kattaa, että tulevaisuudessa postitse.

tämä oli yksinkertainen skenaario, mutta kaiken kaikkiaan olin todella tyytyväinen siihen, miten helppoa oli hyödyntää ActiveStorage ja korvata CarrierWave sillä. Pidän myös ajatus, joka on mennyt eri osiin ActiveStorage, koska kaikki näyttää olevan tiedostoja ja kansioita, jotka hienosti vastaavat rakennetta loput kiskot. Olen ehdottomasti sitä mieltä, että kannattaa päästä Rails 5.2, jotta voit käyttää ActiveStorage tiedostojen latauksia sinulle sovelluksia!

Lue lisää!

Kiinnostaako saada lisää tietoa Rubysta, ja Ruby On Rails? Opetan Web-sovelluskehitystä EPFL Extension Schoolissa, sertifioidussa verkko-oppimisalustassa, jossa opetetaan digitaalisia taitoja datatieteessä, web-sovelluskehityksessä ja paljon muuta. EPFL on yksi maailman johtavista yliopistoista, ja se on Times Higher Education-rankingin ”Number 1 Young University” – listalla.



+