Grave inn i skinner 4

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.


Noen bokføring

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.

Ruby> = 1.9.3

Rails 4 støtter bare Ruby 1.9.3+. Gjør deg klar for en oppgradering hvis du ikke har gjort det ennå.

Standardfiler som standard

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!

Ikke mer 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.

Nye testkataloger

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.

kjør~~POS=TRUNC

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ø.


Sterke parametere

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.


Turbolinks

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 </code> og <code><body></code> i DOM. Hastighetsgevinstene kommer fra at du ikke trenger å laste ned og reparse JavaScript og CSS-eiendeler.</p> <p>Turbolinks nedgraderes grasiøst for nettlesere som ikke støtter <code>pushstate</code>. I disse situasjonene oppfører sidens koblinger som normalt, noe som forårsaker en fullstendig oppdatering av siden.</p> <h3>Hendelser og Cache</h3> <p>Det er vanlig i applikasjoner å vente på at en side skal lastes helt før du utfører noen JavaScript. For eksempel:</p> <pre> $ (dokument) .ready (/ * noen funksjon å kjøre * /) // eller hendelse bare $ (/ * noen funksjon å kjøre * /)</pre> <p>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:</p> <ul> <li> <code>side: hente</code> - begynner å hente en side fra serveren</li> <li> <code>side: endring</code> - en side er lastet inn</li> <li> <code>side: last</code> - en side er lastet fra en server henting</li> <li> <code>side: gjenopprette</code> - en side er lastet fra en cache-henting</li> </ul> <p>De <code>side: endring</code> Eventet brenner alltid når Turbolinks laster en side, etterfulgt av <code>side: last</code> eller <code>side: gjenopprette</code>, avhengig av om lasten kom fra serveren eller hurtigbufferen.</p> <h3>Potensielle problemer</h3> <blockquote><p>Rails 4 kommer, og det bringer en rekke endringer i rammen.</p></blockquote> <p>Turbolinks har noen problemer som du kanskje trenger å ta opp:</p> <ul> <li> <strong>Minnelekkasjer</strong>: Turbolinks sletter ikke eller oppdaterer JavaScript når siden endres. Du kan potensielt se effektene av minnelekkasjer i applikasjonene dine, spesielt hvis du bruker mye JavaScript.</li> <li> <strong>Eventbindinger</strong>: Du må ta hensyn til eldre nettlesere. Pass på at du lytter etter <code>side:*</code> hendelser, så vel som <code>DOMContentLoaded</code>.</li> <li> <strong>Klient-side rammer</strong>: Turbolinks kan ikke leke pent med andre klient-side rammer som Backbone, Angular, Knockout, Ember, etc.</li> </ul> <h3>Utmelding</h3> <p>Du kan velge bort Turbolinks ved å:</p> <ol> <li>fjerning <code>turbolinks</code> fra Gemfile, og</li> <li>fjerner <code>// = krever turbolinks</code> linje fra <code>application.js</code> </li> </ol> <hr> <h2>caching</h2> <p>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.</p> <h3>Russiske dukker</h3> <p>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:</p> <pre> klasse milepæl < ActiveRecord::Base has_many :todos end class Todo < ActiveRecord::Base belongs_to :milestone, :touch => sann slutt</pre> <p>De <code>:ta på</code> 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.</p> <p>Vi har nå finkornede cacher i våre synspunkter. Vurder denne filen som et eksempel (<code>app / visninger / milepæler / show.html.erb</code>):</p> <pre> <% cache @milestone do %> <h1><%= @milestone.name %></h1> <div><%= @milestone.description %></div> <ul> <%= render @milestone.todos %> </ul> <% end %></pre> <p>Og i <code>app / visninger / todos / _todo.html.erb</code>:</p> <pre> <% cache todo do %> <li> <%= todo.description %> <span><%= todo.status %></span> </li> <% end %></pre> <p>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..</p> <blockquote><p>PATCH er nå det nye HTTP-verbet for oppdatering av ressurser.</p></blockquote> <p>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.</p> <h3>Cache Digests</h3> <p>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.</p> <p>For mer informasjon (og for bruk i Rails 3), sjekk ut README for cache digestene perlen.</p> <hr> <h2>Streaming, via ActionController :: Live</h2> <p>Den nye <code>ActionController :: Levende</code> modulen gir muligheten til å streame data til klienter. Ganske enkelt <code>inkludere</code> 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.</p> <p>Her er et eksempel fra Rails 4-dokumentasjonen:</p> <pre> 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</pre> <p>Som docs notat er det tre ting å huske på:</p> <ul> <li>Du må skrive noen overskrifter <em>før</em> du ringer <code>skrive</code> eller <code>Lukk</code> på responsstrømmen.</li> <li>Du må ringe <code>Lukk</code> på svarstrømmen når du er ferdig med å skrive data.</li> <li>Sørg for at handlingene dine er trådssikre, da de kjører i en egen tråd.</li> </ul> <hr> <h2>Nicetier og andre ting</h2> <p>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.</p> <h3>LAPP</h3> <p>Som beskrevet i Rails-bloggen, er PATCH nå HTTP-verbet for oppdatering av ressurser.</p> <blockquote><p>Denne endringen vil vanligvis være gjennomsiktig for utviklere, da PUT-forespørsler fortsatt vil rute til <code>Oppdater</code> handling for RESTful-stil ruter.</p></blockquote> <p>Men det er en endring som du bør være oppmerksom på; PUT-ruting kan endres i fremtiden.</p> <h3>Tilpassede Flash-typer</h3> <p>Denne lille funksjonen kan bidra til å rydde opp noen kode. Du kan registrere dine egne flashtyper til bruk i <code>redirect_to</code> samtaler og i maler. For eksempel:</p> <pre> # 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 <div><%= error %></div> <div><%= catastrophe %></div></pre> <h3>Utdaterte Finders</h3> <p>Rails 4 deaktiverer gammeldags søkemulighet hashes, samt alle dynamiske finder metoder (med unntak av <code>find_by_ ... </code> og <code>find_by_ ... </code>). I stedet vil du bruke <code>hvor</code>:</p> <ul> <li> <code>find_all_by_ ... </code> kan skrives om ved hjelp av <code>hvor(… )</code>.</li> <li> <code>find_last_by_ ... </code> kan skrives om ved hjelp av <code>hvor (...) .last</code>.</li> <li> <code>scoped_by_ ... </code> kan skrives om ved hjelp av <code>hvor(… )</code>.</li> <li> <code>find_or_initialize_by_ ... </code> kan skrives om ved hjelp av <code>hvor (...) .first_or_initialize</code>.</li> <li> <code>find_or_create_by_ ... </code> kan skrives om ved hjelp av <code>find_or_create_by (...)</code> eller <code>hvor (...) .first_or_create</code>.</li> <li> <code>find_or_create_by_ ... !</code> kan skrives om ved hjelp av <code>find_or_create_by! (...)</code> eller <code>hvor (...) .first_or_create!</code>.</li> </ul> <p>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.</p> <h3>Routing Bekymringer</h3> <p>Routing Concerns er et forsøk på å tørke opp din <code>config / routes.rb</code>. Den grunnleggende ideen er å definere vanlige delressurser (som kommentarer) angående og inkludere dem i andre ressurser / ruter. Her er det opplagte eksemplet:</p> <pre> 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</pre> <p>Ovennevnte er ekvivalent med følgende Rails 3-kode:</p> <pre> ressurser: innlegg gjør ressurser: kommentarer slutt ressurser: artikler gjør ressurser: kommentarer ressurser: kommentarer slutter</pre> <p>Personlig er jeg ikke sikker på at dette gir mye verdi; kanskje det gir mening for store applikasjoner med hundrevis av ruter.</p> <h3>Omdøpt tilbakeringinger</h3> <p>Handlingsanrop i kontroller har blitt omdøpt fra <code>*_filter</code> til <code>*_handling</code>. For eksempel:</p> <pre> 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</pre> <p>Den gamle <code>*_filter</code> tilbakeringinger fungerer fortsatt og blir ikke avskrevet; så kan du fortsatt bruke dem hvis du ønsker det. DHHs grunn til endringen var:</p> <blockquote><p>"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."</p></blockquote> <hr> <h2>Wrapping Up</h2> <p>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.</p> <blockquote> <p>Hvis du virkelig vil vade inn i den dype enden, sjekk ut vår Tuts + Premium kurs på Rails 4!</p> </blockquote> <div class="rek-block"> <center> <ins class="adsbygoogle" style="display:inline-block;width:580px;height:400px" data-ad-client="ca-pub-3810161443300697" data-ad-slot="9434875811"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </div> <div class="h-alltags"> <a href="articles/code">Kode</a> </div> </div> </div> </div> </div> <div class="next_posts clearfix"> <div class="n_post"> <div class="next_posts-h1 left_nh1"><a href="/articles/code/digging-into-the-theme-customizer-components.html">Graving Into Theme Customizer Komponenter</a></div> <div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_21/digging-into-the-theme-customizer-components_2.png');"></div> </div> <div class="n_post"> <div class="next_posts-h1 right_nh1"><a href="/articles/code/digging-in-to-laravels-ioc-container.html">Graver inn til Laravel's IoC Container</a></div> <div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_12/digging-in-to-laravels-ioc-container.png');"></div> </div> </div> <footer> <div class="container"> <div class="footer-langs"> <ul class="site-langs-list"> <li><a href="https://www.accentsconagua.com"><i class="flag flag-DE"></i>Deutsch</a></li> <li><a href="https://fr.accentsconagua.com"><i class="flag flag-FR"></i>Français</a></li> <li><a href="https://nl.accentsconagua.com"><i class="flag flag-NL"></i>Nederlands</a></li> <li><a href="https://no.accentsconagua.com"><i class="flag flag-NO"></i>Norsk</a></li> <li><a href="https://sv.accentsconagua.com"><i class="flag flag-SE"></i>Svenska</a></li> <li><a href="https://it.accentsconagua.com"><i class="flag flag-IT"></i>Italiano</a></li> <li><a href="https://es.accentsconagua.com"><i class="flag flag-ES"></i>Español</a></li> <li><a href="https://ro.accentsconagua.com"><i class="flag flag-RO"></i>Românesc</a></li> </ul> </div> <div class="h-block"><a href="/">no.accentsconagua.com</a><div class="h-block-a"></div></div> <div class="footer-text"> Interessant informasjon og nyttige tips om programmering. Nettstedutvikling, webdesign og webutvikling. Photoshop opplæringsprogrammer. Opprettelse av dataspill og mobile applikasjoner. Bli en profesjonell programmerer fra grunnen av. </div> </div> </footer> <div class="search"> <img class="searchico" src="//accentsconagua.com/img/search.svg" alt=""> </div> <div class="modal"> <div class="modal-content"> <span class="close-button">×</span> <input class="searchmain" type="text" id="search-input" placeholder="Søke..."> <ul class="searchli" id="results-container"></ul> </div> </div> <link rel="stylesheet" href="css/flags.css"> <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script> <script> window.addEventListener("load", function(){ window.cookieconsent.initialise({ "palette": { "popup": { "background": "#edeff5", "text": "#838391" }, "button": { "background": "#4b81e8" } }, "theme": "classic", "position": "bottom-right" })}); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script src="js/scripts.min.js"></script> <script src="js/common.js"></script> <link rel="stylesheet" href="css/fontawesome-all.min.css"> <script> var modal = document.querySelector(".modal"); var trigger = document.querySelector(".search"); var closeButton = document.querySelector(".close-button"); function toggleModal() { modal.classList.toggle("show-modal"); } function windowOnClick(event) { if (event.target === modal) { toggleModal(); } } trigger.addEventListener("click", toggleModal); closeButton.addEventListener("click", toggleModal); window.addEventListener("click", windowOnClick); </script> <script src="https://unpkg.com/simple-jekyll-search@1.5.0/dest/simple-jekyll-search.min.js"></script> <script> SimpleJekyllSearch({ searchInput: document.getElementById('search-input'), resultsContainer: document.getElementById('results-container'), json: '/search.json', searchResultTemplate: '<li><a href="{url}">{title}</a></li>' }) </script> <script src="jquery.unveil2.min.js"></script> <script> $('img').unveil(); </script> </body> </html>