Zoals ik in mijn eerdere Ruby on Rails-zelfstudie vermeldde, is Unobtrusive JavaScript (UJS) een van de coolste nieuwe functies in Rails 3. UJS maakt door Rails gegenereerde code veel schoner, helpt je JavaScript-logica scheiden van je HTML-lay-outs en ontkoppelt Rails van de Prototype JavaScript-bibliotheek. In deze zelfstudie gaan we naar deze functies kijken en leren hoe we ze kunnen gebruiken in een eenvoudige Rails 3-toepassing.
Om te beginnen, wat is UJS precies? Eenvoudig, UJS is JavaScript dat is gescheiden van uw HTML-markup. De eenvoudigste manier om UJS te beschrijven is met een voorbeeld. Neem een onclick event handler; we zouden het opdringerig kunnen toevoegen:
Link
Of we kunnen het onopvallend toevoegen door de gebeurtenis aan de link te koppelen (met behulp van jQuery in dit voorbeeld):
Link
Zoals vermeld in mijn inleiding, heeft deze tweede methode een aantal voordelen, waaronder eenvoudigere foutopsporing en schonere code.
"Rails 3 daarentegen is JavaScript-agnostisch, met andere woorden, u kunt uw JavaScript-framework van keuze gebruiken, mits er een Rails UJS-implementatie bestaat voor dat framework."
Tot en met versie 3 heeft Ruby on Rails opdringerige JavaScript gegenereerd. De resulterende code was niet schoon, maar erger nog, deze was nauw gekoppeld aan het JavaScript-raamwerk van Prototype. Dit betekende dat tenzij je een plug-in of gehackte Rails hebt gemaakt, je de Prototype-bibliotheek met de JavaScript-hulpmethoden van Rail moest gebruiken.
Rails 3, aan de andere kant, is JavaScript-framework agnostisch. Met andere woorden, u kunt uw JavaScript-framework van keuze gebruiken, mits er een Rails UJS-implementatie bestaat voor dat framework. De huidige UJS-implementaties omvatten het volgende:
Rails 3 implementeert nu al zijn JavaScript Helper-functionaliteit (AJAX-submits, bevestigingsprompts, enz.) Onopvallend door de volgende aangepaste HTML 5-kenmerken aan HTML-elementen toe te voegen.
Bijvoorbeeld deze koppelingstag
Vernietigen
zou een AJAX-verwijderingsverzoek verzenden na de gebruiker te vragen: "Weet je het zeker?"
Je kunt je voorstellen hoeveel moeilijker het is om dat te lezen als al dat JavaScript inline was.
Nu we UJS hebben besproken en hoe Rails UJS implementeert, laten we een project opzetten en een aantal specifieke toepassingen bekijken. We zullen de jQuery-bibliotheek en de UJS-implementatie gebruiken in deze zelfstudie.
Omdat we vanaf het begin een nieuw project maken, is het eerste dat we moeten doen het project maken door het volgende te typen:
rails nieuwe blog --skip-prototype
Merk op dat ik Rails opdraag het JavaScript-bestand van het prototype over te slaan, omdat ik de jQuery-bibliotheek ga gebruiken.
Laten we de server starten om er zeker van te zijn dat alles lijkt te werken.
En, voila!
Nu we ons project hebben opgezet, moeten we jQuery en de jQuery UJS aan ons project toevoegen. U bent vrij om uw JavaScript te organiseren zoals u dat wilt, maar de Rails-conventie voor het structureren van uw JavaScript-bestanden is als volgt (al deze bestanden worden openbaar gemaakt / javascripts):
Download jQuery.JS (of verwijs naar een CDN) en rails.js als je dat nog niet hebt gedaan en voeg ze toe aan je public / javascripts
directory.
Het laatste dat we moeten doen om aan de slag te gaan is om Rails te vertellen deze js-bestanden op al onze pagina's op te nemen. Hiervoor opent u application.rb in de map config en voegt u de volgende regel toe
config.action_view.JavaScript_expansions [: standaardwaarden] =% w (applicatie jQuery-rails)
Dit configuratie-item geeft Rails de opdracht om de drie hierboven genoemde JavaScript-bestanden standaard op te nemen.
Als alternatief zou je jQuery van een CDN kunnen pakken (d.w.z. http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js) door handmatig een scripttag toe te voegen die naar de juiste locatie wijst. Als u dit doet, moet u 'jQuery' verwijderen uit het configuratie-item JavaScript_expansions.
Om de UJS-functionaliteit van de rails te demonstreren, moeten we eerst een code hebben om mee te werken. Voor deze demo hebben we gewoon een eenvoudig Post-object. Laten we dat nu genereren
rails genereren steiger Post naam: string titel: string inhoud: tekst
En laten we dan onze database migreren om de posts-tabel te maken.
rake db: migreren
Ok, we zijn goed om te gaan! Als we navigeren naar http: // localhost: 3000 / berichten / nieuw
, we zouden een formulier moeten zien om een nieuw bericht te maken.
Ok, het werkt allemaal! Laten we nu ingaan en zien hoe u de UJS- en AJAX-functionaliteit gebruikt die in Rails is gebakken.
Nu alle vereiste JavaScript-bestanden zijn opgenomen, kunnen we Rails 3 daadwerkelijk gaan gebruiken om enkele AJAX-functies te implementeren. Hoewel je alle aangepaste JavaScripts die je wilt kunt schrijven, biedt Rails een aantal mooie ingebouwde methoden die je kunt gebruiken om eenvoudig AJAX-aanroepen en andere JavaScript-acties uit te voeren.
Laten we eens kijken naar een paar veel gebruikte rails-helpers en het JavaScript dat ze genereren
Als we naar ons formulier Berichten kijken, kunnen we zien dat wanneer we een bericht maken of bewerken, het formulier handmatig wordt ingediend en we vervolgens worden omgeleid naar een alleen-lezen weergave van dat bericht. Wat als we dat formulier via AJAX willen indienen in plaats van een handmatige inzending te gebruiken?
Rails 3 maakt het gemakkelijk om elk formulier naar AJAX te converteren. Open eerst uw _form.html.erb
gedeeltelijk in app / views / posts, en verander de eerste regel van:
<%= form_for(@post) do |f| %>
naar
<%= form_for(@post, :remote => waar) do | f | %>
Voorafgaand aan Rails 3, toevoegen : remote => true
zou een aantal inline JavaScript gegenereerd hebben in de form-tag, maar met Rails 3 UJS is de enige wijziging de toevoeging van een HTML 5 aangepast attribuut. Kun je het zien?