Rails 4 nærmer seg raskt. I denne artikkelen kan vi se på noen av de nye funksjonene den tilbyr, samt endringene som kan påvirke dine nåværende programmer.
Cache-fordøyelser er Rails 4-løsning for å spore endringene av aggressivt cached-maler.
Det er flere konfigurasjons- og strukturelle endringer som følger med Rails 4.
Rails 4 støtter bare Ruby 1.9.3+. Gjør deg klar for en oppgradering hvis du ikke har gjort det ennå.
Rails 4 vil som standard være thread-safe, fjerne overhead og forbedre ytelsen på trådte servere, som tynn og puma. Du må sørge for at søknaden din (og avhengighetene) er trådsikker, noe som vanligvis betyr at du unngår global tilstand (for eksempel klasse eller globale variabler).
Aaron Patterson skrev og snakket om dette emnet. Sikkert sjekke dem ut!
leverandør / plugins
Rails 3 omfavnet ideen om å bruke perler for å legge til tilpasset funksjonalitet til Rails, og avviklet bruken av plugins. Rails 4 fullfører denne overgangen ved å fjerne leverandør / plugins
katalog helt.
Standard testkatalog navngivelse ordningen er klarere enn i Rails 3.
Følgende kataloger vil nå bli generert: test / modeller
, test / hjelpere
, Test / kontrollører
, test / reklame
, og test / integrering
.
De manus
katalogen er fjernet til fordel for en ny bin
katalogen. Dette er hvor programmets kjørbare filer vil leve og kjører rake rails: oppdatering: bin
vil sette bunt
, rake
, og skinner
binstubs i appen din bin
katalog.
Denne endringen kan være nyttig i utviklingen, spesielt på en maskin med flere Ruby-versjoner og perler. Du kan bruke bin / skinner
i stedet for buntekskinner
for å sikre at du kjører kjørbare i riktig miljø.
Rails 4 takler massetildelingsproblemet med den nye Strong Parameters-perlen. Et Rails 3-program kan ha en skape
handling som ligner på følgende eksempel:
klasse UsersController < ApplicationController def create @user = User.create(params[:user]) #… check validity, redirect, etc. end end
Du kan beskytte mot uventet inngang med erklæringer i modellen:
klassen bruker < ActiveRecord::Base # Only allow the following attributes to be mass-assigned attr_accessible :name, :email end
Bruke Rails 4's Strong Parameters-perler beveger brukerinngangen til kontrolleren:
klasse UsersController < ApplicationController def create @user = User.create(user_params) #… check validity, redirect, etc. end def user_params params.require(:user).permit(:name, :email) end end
Som du kan se, er params
hash i kontrolleren din er ikke en vanlig hash. Det er faktisk en forekomst av ActionController :: Para
, som avslører krever
og tillate
fremgangsmåter.
De krever
Metoden sikrer at den angitte nøkkelen er tilgjengelig i params
hash, og reiser en ActionController :: ParameterMissing
unntak hvis nøkkelen ikke eksisterer.
De
tillate
Metoden beskytter deg mot uventet masseoppgave.
Samtalen User.create (parametere [: bruker])
reiser en ActiveModel :: ForbiddenAttributesError
unntak, men bruk User.create (params.require (: user) .permit (: navn,: email))
gjør det jobbe uten klage.
Rails 3 Mass-assignment-funksjonaliteten er ikke bare deaktivert i Rails 4, men har blitt hentet til en perle, hvis du trenger den funksjonaliteten.
Rails 4 vil som standard være trådsikker, fjerne overhead og forbedre ytelsen.
En kontroversiell ny funksjon i Rails 4 er Turbolinks, en JavaScript-plugin designet for å gjøre appnavigering raskere i nettleseren.
I nettlesere med pushstate
støtte, ved å klikke på en kobling får Turbolinks-plugin-modulen å sparke inn. Det gjør en Ajax-forespørsel, oppdaterer nettadressen med pushstate
(slik at din tilbakeknapp fungerer) og bruker JavaScript for å oppdatere
og i DOM. Hastighetsgevinstene kommer fra at du ikke trenger å laste ned og reparse JavaScript og CSS-eiendeler.
Turbolinks nedgraderes grasiøst for nettlesere som ikke støtter pushstate
. I disse situasjonene oppfører sidens koblinger som normalt, noe som forårsaker en fullstendig oppdatering av siden.
Det er vanlig i applikasjoner å vente på at en side skal lastes helt før du utfører noen JavaScript. For eksempel:
$ (dokument) .ready (/ * noen funksjon å kjøre * /) // eller hendelse bare $ (/ * noen funksjon å kjøre * /)
Med Turbolinks, vil sidelastingshendelsene ikke brenne når brukere navigerer fra "side" til "side" fordi DOM aldri re-legger på nytt. Biblioteket legger derfor til nye hendelser som du kan lytte til, for å utføre eventuelle etterfølgende initialiseringer som appen din kanskje trenger:
side: hente
- begynner å hente en side fra serverenside: endring
- en side er lastet innside: last
- en side er lastet fra en server hentingside: gjenopprette
- en side er lastet fra en cache-hentingDe side: endring
Eventet brenner alltid når Turbolinks laster en side, etterfulgt av side: last
eller side: gjenopprette
, avhengig av om lasten kom fra serveren eller hurtigbufferen.
Rails 4 kommer, og det bringer en rekke endringer i rammen.
Turbolinks har noen problemer som du kanskje trenger å ta opp:
side:*
hendelser, så vel som DOMContentLoaded
.Du kan velge bort Turbolinks ved å:
turbolinks
fra Gemfile, og// = krever turbolinks
linje fra application.js
Rails 4 gir en omhyggelig caching-strategi. For det første er handling og side-caching, som du kanskje kjenner det fra tidligere versjoner av Rails, fjernet og hentet til perler: handling og side, henholdsvis.
Den nye gutten på blokken er russisk dukkebufring eller nestet fragmentbufring. Den enkleste måten å forstå dette systemet er å se på noen kode. Anta at du har et prosjektstyringsprogram. Du kan ha følgende modeller:
klasse milepæl < ActiveRecord::Base has_many :todos end class Todo < ActiveRecord::Base belongs_to :milestone, :touch => sann slutt
De :ta på
alternativet er nødvendig for denne caching-strategien for å fungere skikkelig. Hvis en todo legges til en milepæl, må vi kaste cachen på milepælen for å unngå å vise uaktuelle visninger.
Vi har nå finkornede cacher i våre synspunkter. Vurder denne filen som et eksempel (app / visninger / milepæler / show.html.erb
):
<% cache @milestone do %><%= @milestone.name %>
<%= @milestone.description %>
Og i app / visninger / todos / _todo.html.erb
:
<% cache todo do %>
Anta nå at du har en milepæl med ti todos. Hvis du bare redigerer en todo, blir milepælens cache ødelagt, men når du genererer HTML, kan alt annet enn en av de todo-partiene hentes fra hurtigbufferen, og dermed forbedre gjentidene..
PATCH er nå det nye HTTP-verbet for oppdatering av ressurser.
Du handler tid for plass, da dette genererer mye cruft i cachen din. Men som DHH påpeker, lagrer cache-butikker som Memcached bare gamle data for å gi plass til nye data. Så dette er ikke et problem i de fleste tilfeller.
Cache-fordøyelser er Rails 4-løsning for å spore endringene av aggressivt cached-maler. Rails 4 spor maler og deres avhengigheter, og det suffiks fragment cache nøkler med MD5 fordøye av malen (og dens avhengigheter). Når du redigerer en av malene dine, mottar cachenøkkelen oppdateringen, og du må ikke manuelt utgjøre malene dine.
For mer informasjon (og for bruk i Rails 3), sjekk ut README for cache digestene perlen.
Den nye ActionController :: Levende
modulen gir muligheten til å streame data til klienter. Ganske enkelt inkludere
modulen inn i en kontroller for å gjøre det mulig for appen din å sende vilkårlig streamet data. Du må bruke en gjenget server, som tynn og puma, for å kunne streame data; handlinger fra streaming kontroller kjører i en egen tråd.
Her er et eksempel fra Rails 4-dokumentasjonen:
klasse MyController < ActionController::Base include ActionController::Live def stream response.headers['Content-Type'] = 'text/event-stream' 100.times response.stream.write "hello world\n" sleep 1 response.stream.close end end
Som docs notat er det tre ting å huske på:
skrive
eller Lukk
på responsstrømmen.Lukk
på svarstrømmen når du er ferdig med å skrive data.Vi har snakket om "overskrift" -funksjonene i Rails 4. Men denne utgivelsen er stor, og inkluderer en rekke mindre endringer for å være klar over.
Som beskrevet i Rails-bloggen, er PATCH nå HTTP-verbet for oppdatering av ressurser.
Denne endringen vil vanligvis være gjennomsiktig for utviklere, da PUT-forespørsler fortsatt vil rute til
Oppdater
handling for RESTful-stil ruter.
Men det er en endring som du bør være oppmerksom på; PUT-ruting kan endres i fremtiden.
Denne lille funksjonen kan bidra til å rydde opp noen kode. Du kan registrere dine egne flashtyper til bruk i redirect_to
samtaler og i maler. For eksempel:
# app / controllers / application_controller.rb klasse ApplicationController add_flash_types: error,: catastrophe end # app / controllers / things_controller.rb klasse ThingsController < ApplicationController def create #… create a thing rescue Error => e redirect_to some_path,: error => e.message redning Catastrophe => e redirect_to another_path,: catastrophe => e.message slutten # app / visninger / layouts / application.html.erb<%= error %><%= catastrophe %>
Rails 4 deaktiverer gammeldags søkemulighet hashes, samt alle dynamiske finder metoder (med unntak av find_by_ ...
og find_by_ ...
). I stedet vil du bruke hvor
:
find_all_by_ ...
kan skrives om ved hjelp av hvor(… )
.find_last_by_ ...
kan skrives om ved hjelp av hvor (...) .last
.scoped_by_ ...
kan skrives om ved hjelp av hvor(… )
.find_or_initialize_by_ ...
kan skrives om ved hjelp av hvor (...) .first_or_initialize
.find_or_create_by_ ...
kan skrives om ved hjelp av find_or_create_by (...)
eller hvor (...) .first_or_create
.find_or_create_by_ ... !
kan skrives om ved hjelp av find_or_create_by! (...)
eller hvor (...) .first_or_create!
.Den utdaterte finders perlen vil bli inkludert som en avhengighet i 4.0. og fjernet i 4.1. Perlen vil imidlertid være rundt og opprettholdes til 5,0.
Routing Concerns er et forsøk på å tørke opp din config / routes.rb
. Den grunnleggende ideen er å definere vanlige delressurser (som kommentarer) angående og inkludere dem i andre ressurser / ruter. Her er det opplagte eksemplet:
bekymring: kommentarable gjør ressurser: kommentarer slutten bekymring: bemerkelsesverdig gjør ressurser: bemerkninger slutten ressurser: innlegg,: bekymringer =>: kommentare ressurser: artikler,: bekymringer => [: kommentarable:: bemerkelsesverdig] # kan omfatte flere
Ovennevnte er ekvivalent med følgende Rails 3-kode:
ressurser: innlegg gjør ressurser: kommentarer slutt ressurser: artikler gjør ressurser: kommentarer ressurser: kommentarer slutter
Personlig er jeg ikke sikker på at dette gir mye verdi; kanskje det gir mening for store applikasjoner med hundrevis av ruter.
Handlingsanrop i kontroller har blitt omdøpt fra *_filter
til *_handling
. For eksempel:
klasse UsersController < ApplicationController before_action :set_user, :except => [: index,: new,: create before_action: require_the_president,: only => [: fire_the_missiles] private def set_user @user = en eller annen måte_find_and_sett_the_user (params [: id]) slutten def need_the_president @ user.is_the_president? slutten
Den gamle *_filter
tilbakeringinger fungerer fortsatt og blir ikke avskrevet; så kan du fortsatt bruke dem hvis du ønsker det. DHHs grunn til endringen var:
"For å unngå misforståelsen om at disse tilbakekallingene bare er egnet til å transformere eller stoppe svaret. Med den nye stilen er det mer innbydende å bruke dem som de var ment, for eksempel å sette delte ivars for visninger."
Rails 4 kommer, medfører det en rekke endringer. Jeg håper at denne artikkelen har gitt deg en følelse av hva du kan forvente, og kanskje et startpunkt for å undersøke hva denne nye versjonen har å tilby.
Hvis du virkelig vil vade inn i den dype enden, sjekk ut vår Tuts + Premium kurs på Rails 4!