Från och med den 23 december 2008 slås Merb (Mongrel + Erb)-projektet samman med Rails, och en version med de bästa funktionerna av båda kommer att släppas 2010 under namnet Räls 3. Huvudsakliga tillägg i Rails 3.0 – Helt ny router med tonvikt på RESTful-deklarationer – Ny Action Mailer API modellerad efter Action Controller – Nytt Active Record-kedjebart frågespråk byggt ovanpå relations algebra – Diskreta Javascript-hjälpare med drivrutiner för Prototype och jQuery
Nästan alla Rails egenskaper har uppgraderats i Rails 3.0. Följande listar alla egenskaper och dess uppgraderingar och tillägg till den tidigare utgåvan: De grundläggande ändringarna inkluderar följande: – Rails 3.0 stöder endast Ruby 1.8.7 och högre – Applikationsobjekt För att köra flera Rails-applikationer i samma process har ett nytt koncept som kallas Application object introducerats. Ett applikationsobjekt innehåller alla applikationsspecifika konfigurationer och är mycket likt config/environment.rb från de tidigare versionerna av Rails.– Skript/* Det nya skriptet/skenorna ersätter alla skript som tidigare fanns i skriptkatalogen. T.ex.: istället för script/konsolskenor konsol istället för script/generera ställningspost title:string rails g scaffoldpost title:string – Gemfile och Bundler Rails använder nu en Gemfile i applikationsroten för att avgöra vilka ädelstenar du behöver för att din applikation ska starta. Denna Gemfil bearbetas av Bundler, som sedan installerar alla dina beroenden. Bundler är ett verktyg som hanterar ädelstensberoenden för din rubyapplikation. Den kan hämta, ladda ner och installera ädelstenarna och alla underordnade beroenden som anges i manifestfilen. Kommandot 'gem install bundler' kommer att installera denna pärla. – Alla Rails kärnkomponenter har frikopplats. Rails kärnkomponenter använder nu samma API som du kan använda för att utveckla plugins. Detta innebär att alla plugin du gör kan komma åt alla funktioner som Rails kärnkomponenter har tillgång till. ORM-plugins behöver nu bara implementera Active Model-gränssnitt för att fungera sömlöst med Action Pack. Arel Arel är en Object_Oriented tolkning av relationsalgebra. Den tillhandahåller en SQL-abstraktion som förenklar Active Record och ger grunden för relationsfunktionaliteten i Active Record. Mer om Arel diskuteras i Active Record-delen av artikeln. Internationalisering – En internationaliseringspärla som kallas I18n-pärlan har introducerats som används för att stödja programmering på olika regionala språk. Generatorer – Generatorer fick mycket uppmärksamhet i Rails 3.0. Några av de många ändringar och tillägg som gjordes var: Generatorer skrevs om helt och är bakåtkompatibla. Rails mallar API och generators API är nu sammanslagna. Generatorer laddas inte längre från speciella banor längre, de finns bara i Ruby belastningsbanan, så anropande skenor genererar foo kommer att leta efter generatorer/foo_generator. Nya generatorer ger krokar, så alla mallmotorer, ORM, testramverk kan enkelt kopplas in. Nya generatorer låter dig åsidosätta mallarna genom att placera en kopia på RAILS_ROOT/lib/templates. Rails::Generators::TestCase levereras också så att du kan skapa dina egna generatorer och testa dem. ActionController ActionController och ActionMailer har förenklats avsevärt med gemensam kod borttagen från alla dessa bibliotek och lagts in i en AbstractController. Abstract Controller drar ut de generiska delarna av Action Controller till en återanvändbar modul som alla bibliotek kan använda för att rendera mallar, rendera partier, hjälpare, översättningar, loggning, vilken del som helst av förfrågningssvarscykeln. application_controller.rb har nu protect_from_forgery på som standard. Cookie_verifier_secret har flyttats till initializers/cookie_verification_secret.rb. Session_store-konfigurationen har flyttats till initializers/session_store.rb. cookies.secure gör att du kan ställa in krypterade värden i cookies med cookie.secure[:key] => värde. cookies.permanent som låter dig ställa in permanenta värden i cookie-hash-värdet cookie.permanent[:key] => som ger undantag för signerade värden om verifieringen misslyckas. Du kan nu skicka :notice => 'Detta är ett snabbmeddelande' eller :alert => 'Något gick fel' till formatanropet i ett respond_to-block. Flash[]-hash fungerar fortfarande som tidigare. respons_with-metoden har nu lagts till i dina kontroller för att förenkla de ärevördiga formatblocken. ActionController::Responder har lagts till vilket ger dig flexibilitet i hur dina svar genereras. ActionMailer Skapandet av AbstractController gjorde det möjligt för ActionMailer::Base att nu bara ärva från AbstractController och bara linda in Rails DSL på Mail pärla. Detta minskar mängden kod och duplicering av andra bibliotek i Action Mailer avsevärt. – All e-postmeddelanderelaterad funktionalitet har abstraherats till Mail pärla. Detta minskar kodduplicering och hjälper till att skapa definierbara gränser mellan Action Mailer och e-posttolkaren. – Vad som var postenhetstester har flyttats till funktionstester. – Du kan nu skicka e-post med nytt API med tre metoder: bilagor, rubriker och e-post. ActionView Diskret JavaScript (UJS) har implementerats och gamla inline AJAX-kommandon har tagits bort. Detta gör det möjligt för Rails att använda vilken som helst kompatibel UJS-drivrutin för att implementera UJS-krokarna i hjälparna. Det betyder att alla tidigare fjärrhjälpare har tagits bort från Rails kärna och lagts in i Prototype Legacy Helper. För att få in UJS-hooks i din HTML skickar du nu istället :remote => true. T.ex.: form_for @post :remote => true Du behöver inte längre anropa h(sträng) för att undvika HTML-utdata, den är på som standard i alla vymallar. Om du vill ha den oescaped strängen, ring raw(string). Hjälpare matar nu ut HTML 5 som standard. Form label helper hämtar nu värden från I18n med ett enda värde, så f.label :name kommer att dra :name-översättningen. I18n select label on ska nu vara :en.helpers.select istället för :en.support.select. Du behöver inte längre placera ett minustecken i slutet av en rubininterpolation i en ERb-mall för att ta bort den efterföljande vagnreturen i HTML-utdata. Lade till grouped_collection_select-hjälparen i Action View. Åtgärdsvy nu kommer att ta upp undantag om CSS-formatmallar och javascript-filer listade i hjälparna för javascript_include_tag och stylesheet_include_tag saknas. innehåll_för? har lagts till så att du kan kontrollera om det finns innehåll i en vy innan du renderar. ActiveRecord Tillägget av Arel låter nu Active Record returnera relationer på sina metoder. Dessa relationer kan kedjas samman. Några av metoderna som tillhandahåller dessa är: där – ger villkor för relationen, vad som returneras. välj – välj vilka attribut för modellerna du vill ha returnerat från databasen. grupp – grupperar relationen på det angivna attributet. having – ger ett uttryck som begränsar grupprelationer (GROUP BY-begränsning). joins – sammanfogar relationen till en annan tabell. sats – tillhandahåller ett uttryck som begränsar sammanfogningsrelationer (JOIN-begränsning). inkluderar – inkluderar andra förinstallerade relationer. order – beställer relationen baserat på det angivna uttrycket. limit – begränsar relationen till antalet angivna poster. lås – låser de poster som returneras från tabellen. skrivskyddad – returnerar en skrivskyddad kopia av data. från – ger ett sätt att välja relationer från mer än en tabell. scope – (tidigare kallat_scope) returnerar relationer och kan kedjas ihop med de andra relationsmetoderna. with_scope – och with_exclusive_scope returnerar nu även relationer och kan sålunda kedjas. Ett exempel som använder några av de ovan nämnda metoderna red_items = Item.where(:colour => 'red') red_items.find(1) item = red_items.new Om man nu ger en item.colour blir resultatet => red
red_items.exists? red_items.update_all :colour => 'svart' red_items.exists? Ger en output=> false
Ta ett annat exempel
cars = Car.where(:colour => 'svart') Detta skulle inte ge någon frågeutdata. Om vi vill avfyra en markering måste vi lägga till följande bilar.varje {|c| sätter c.name }
Ovanstående relation kallas lazy loading. Detta är mycket användbart tillsammans med sidofragmentcache. Så i din kontrollåtgärd kan du bara göra
def index @recent_items = Item.limit(10).order('created_at DESC') end
Och enligt din åsikt: <% cache('recent_items') do %> <% @recent_items.each do |item| %> … <% slut %> I exemplet ovan laddas @recent_items på @recent_items.each call från vyn. Eftersom kontrollern faktiskt inte avfyrar någon fråga, blir fragmentcachelagring mer effektiv utan att det krävs några speciella lösningar. Några förbättringar av det gamla API:et har också gjorts, vilka är: Tillagt :förstört? till Active Record-objekt. SQLite 2-stöd har tagits bort till förmån för SQLite 3. MySQL-stöd för kolumnordning. PostgreSQL-adaptern har fått sitt TIME ZONE-stöd fixat så att den inte längre infogar felaktiga värden. Stöd flera scheman i tabellnamn för PostgreSQL. PostgreSQL-stöd för XML-datatypkolumnen. table_name är nu cachad. En stor mängd arbete utfört på Oracle-adaptern också med många buggfixar. named_scope i en Active Record-klass är utfasad och har bytt namn till bara scope. I scope-metoder bör du gå över till att använda relationsmetoderna istället för
:villkor => {} sökmetod, till exempel scope :since, lambda {|tid| where(“created_at > ?”, tid) }. save(false) är utfasad, till förmån för save(:validate => false). I18n-felmeddelanden för ActiveRecord bör ändras från :en.activerecord.errors.template till :en.errors.template. model.errors.on fasas ut till förmån för model.errors[] validates_presence_of => validates. :presence => true ActiveRecord::Base.colorize_logging och config.active_record.colorize_logging är utfasade till förmån för Rails::Subscriber.colorize_logging eller config.colorize_logging find(:first) och find(:all) (utan några alternativ) är också avskaffas till förmån för först och allt. ActiveModel Rails 2.3 har massor av riktigt trevlig funktionalitet inlåst i monolitiska komponenter. Rails 3 har öppnat upp mycket av den funktionaliteten i ActionPack, vilket gör det lättare att återanvända routern, avsändaren och enskilda delar av ActionController. Valideringar har flyttats från Active Record till Active Model, vilket ger ett gränssnitt till valideringar som fungerar över ORM-bibliotek i Rails 3. Det finns nu en validates :attribute, options_hash genvägsmetod som låter dig skicka alternativ för alla validates klassmetoder, du kan skicka mer än ett alternativ till en valideringsmetod. Valideringsmetoden har följande alternativ: :acceptance => Boolean. :bekräftelse => Boolean. :exclusion => { :in => Ennumerable }. :inkludering => { :in => Ennumerable }. :format => { :with => Regexp, :on => :create }. :längd => { :maximum => Fixnummer }. :numericality => Boolean. :närvaro => Boolean. :unikhet => Boolean. ActionDispatch En ny och ren implementering av routing görs med hjälp av ActionDispatch. Rutter som definieras av varje applikation har nu namnavstånd i din applikationsmodul. T.ex.: Den första raden i filen routers.rb, dvs ActionController: :Routing: :Routes.draw do |map| map.resources :post end har ersatts av AppName: :Application.routes do resources :posts end Matchningsmetod har lagts till i routern. Alla Rack-applikationer kan skickas till den matchade rutten. Rutter kan uttryckas via block, till exempel kan du ringa kontrollant :home { match '/:action' }. Till exempel: map.connect 'products/:id', :controller => 'catalog',:action =>'view' match 'products/:id' => 'catalog#view' Medan mycket av Rails 3 ser en intern omskrivning, har Routes DSL sett en fullständig revidering i Rails 3. Det har skrivits om från grunden några gånger tidigare, och det har gett snabbhet och flexibilitet med varje iteration. Den nya DSL tar färre tangenttryckningar och ser ren ut. Här är en typisk RESTful ruttfil i Rails 2: map.resources :products, :member => {:short => :post}, :collection => {:long => :get} do |products| products.resource :category end Så här ser det ut i Rails 3: resurser :produkter gör resurs :kategori medlem gör post :short end samlingen får :long end end
Det har gjorts många tillägg och ändringar i många av Rails egenskaper. Även om det kan vara för tidigt för några av oss att ändra vår syn på de nya API:erna och deras syntax, fungerar den gamla syntaxstilen fortfarande på grund av ett bakåtkompatibilitetslager som har lagts till. Detta kommer dock att tas bort i Rails 3.1-versionen.
Kontakta oss.