ݺߣ

ݺߣShare a Scribd company logo
DAI: Módul 9 Ruby on Rails Xavier Noguero Carles Mateu   http://carlesm.com Ciències de la Computació i Intel·ligència Artificial Universitat de Lleida
Ruby on Rails, què és? Ruby és un llenguatge de programació. Rails és un “framework” modern que fa molt fàcil el desenvolupament i manteniment d'aplicacions web. Molt escollit per crear aplicacions Web 2.0!!
Ruby on Rails, perquè? Java? PHP? .NET?  Molta feina per a desenvolupar...
Rails, és fàcil! Tècniques modernes i professionals. Un exemple: Patró Model-Vista-Controlador En Java: Struts, Tapestry...
Amb Ruby i Rails: L'esquelet de ó es crea automàticament.
Només ens cal crear el codi just de la lògica de negoci.
Tests, es creen ܳٴdzàپԳ!
La base, Ruby És un llenguatge interpretat orientat a objectes.
No és nou, va ser creat als anys 90 per un japonés, en Yukihiro Matsumoto.
S'ha fet popular durant els últims anys a mesura que han aparegut llibres i documentació en anglès.
(i en gran mesura gràcies a Rails).
irb, un shell interactiu de Ruby És intérpret de comandes que es pot utilitzar per a testejar codi ràpidament:
rdoc, per a fer documentació És l'eina que ens permet generar la documentació del codi que escrivim: Es pot especificar de quin o quins fitxers volem que es generi la documentació.
El format de sortida és HTML.
RubyGems És l'eina per a gestionar el sistema de paquets de Ruby: Un format estàndard per a distribuir programes i llibreries Ruby.
Gestiona la instalació de paquets gem (de manera similar com ara yum o apt-get per a distros linux).
Rails is Agile L'any 2001, 17 crítics dels models de desenvolupament de programari, van signar l'Agile Manifesto. http://agilemanifesto.org/   Aquest, defineix nous mètodes de desenvolupament de programari com una alternativa a les metodologies formals existents, considerades massa “pesades” i rígides pel seu caràcter normatiu i la seva alta dependència en les planificacions prèvies a l'etapa de desenvolupament.
Alguns exemples: Extreme Programming, Scrum...
Rails, per tal com s'ha concebut, segueix aquestes pràctiques!
Extremme Programing (XP) Considerada per molts com “la manera com realment volen treballar els programadors”
Es basa principalment en: Fer releases petites i freqüents.
Desenvolupar en cicles iteratius.
Implementar només el que hi ha l'especificació.
Escriure sempre primer el codi de test.
Seguir la planificació de manera realista.
Refactoritzar sempre que es pugui.
Fer-ho tot simple.
Programar en parelles, i intercanviar rols dins el projecte, per tal que tothom conegui millor el codi.
Arquitectura MVC Patró Model-Vista-Controlador
Arquitectura MVC - Model Patró Model-Vista-Controlador Model: Part responsable de mantenir l'estat de ó.
Engloba: Dades: manipulació de bases de dades, fitxers, etc.
Regles per mantenir coherents les dades en tot moment.
Arquitectura MVC - Vista Patró Model-Vista-Controlador Vista: Part responsable de generar la interfície d'usuari.
Accedeix al model per a presentar les dades a l'usuari de ó
Arquitectura MVC - Controlador Patró Model-Vista-Controlador Controlador: Part responsable d'orquestrar el funcionament de ó.
Rep events de l'usuari, interacciona amb el model i tria una vista adecuada per a donar resposta de nou a l'usuari.
Rails és un framework M-V-C Patró Model-Vista-Controlador amb Rails: Model: Active Record
Vista i controlador: Action Pack
Les URL's amb Rails Imaginem una URL d'una aplicació web Rails: En aquest exemple: laNostraAplicacio.com : adreça base de ó.
Saludar : és el controlador.
hello : és l'acció que s'executarà. Per tant, les URL's en Rails es mapegen a controladors i accions!
Programant Ruby on Rails Primer hem d'instal·lar les eines adients: Ruby
Ruby on Rails (Gem)
Base de dades (SQLITE3, MySQL)
Servidor Web Opcions: Bitnami: ( http://bitnami.org ) Kits de programació (Stacks) per Linux/Windows/Mac/Solaris
Locomotive (Mac)
InstantRails (Windows)
Distribució (Linux)

More Related Content

Similar to Dai 09-ruby on rails (20)

Web Application(3)
Web Application(3)Web Application(3)
Web Application(3)
guest5ef53
Turbo Gears, Framework De Python Per Aplicacions Web
Turbo Gears, Framework De Python Per Aplicacions WebTurbo Gears, Framework De Python Per Aplicacions Web
Turbo Gears, Framework De Python Per Aplicacions Web
Tomàs Reverter
Presentació de Javascript
Presentació de JavascriptPresentació de Javascript
Presentació de Javascript
Roger Casadejús Pérez
Presentacio Django
Presentacio DjangoPresentacio Django
Presentacio Django
Antoni Aloy
Tema 5
Tema 5Tema 5
Tema 5
valeroandreu
Full stack R
Full stack RFull stack R
Full stack R
Jordi Rosell
Aplicacions web
Aplicacions webAplicacions web
Aplicacions web
guest335c1a
ARSO-M6: Administracio del web - Guio
ARSO-M6: Administracio del web - GuioARSO-M6: Administracio del web - Guio
ARSO-M6: Administracio del web - Guio
Aurora Lara Marin
Itineraris IT Academy (2020)
Itineraris IT Academy (2020)Itineraris IT Academy (2020)
Itineraris IT Academy (2020)
Barcelona Activa
Framework Llibreries Lliures
Framework Llibreries LliuresFramework Llibreries Lliures
Framework Llibreries Lliures
Jordi Catà
Migració al programari lliure: reptes i oportunitats
Migració al programari lliure: reptes i oportunitatsMigració al programari lliure: reptes i oportunitats
Migració al programari lliure: reptes i oportunitats
Ismael Fanlo
Comparativa ERPs de programari lliure
Comparativa ERPs de programari lliureComparativa ERPs de programari lliure
Comparativa ERPs de programari lliure
ejordi
Presentació Ajax
Presentació AjaxPresentació Ajax
Presentació Ajax
Roger Casadejús Pérez
SIGT09 Introducció Joomla
SIGT09 Introducció JoomlaSIGT09 Introducció Joomla
SIGT09 Introducció Joomla
Alex Araujo
Cas d’us de Framework web desenvolupat amb llibreries Lliures
Cas d’us de Framework web desenvolupat amb llibreries LliuresCas d’us de Framework web desenvolupat amb llibreries Lliures
Cas d’us de Framework web desenvolupat amb llibreries Lliures
Jordi Catà
Presentació del servidor Apache
Presentació del servidor ApachePresentació del servidor Apache
Presentació del servidor Apache
Roger Casadejús Pérez
Power Point Informàtica
Power Point InformàticaPower Point Informàtica
Power Point Informàtica
AndreuSegui

More from Carles Mateu (15)

Local Exploits
Local ExploitsLocal Exploits
Local Exploits
Carles Mateu
Curs Estiu: Continguts
Curs Estiu: ContingutsCurs Estiu: Continguts
Curs Estiu: Continguts
Carles Mateu
Curs Estiu: Laboratori 1
Curs Estiu: Laboratori 1Curs Estiu: Laboratori 1
Curs Estiu: Laboratori 1
Carles Mateu
Curs Estiu: Laboratori 2
Curs Estiu: Laboratori 2Curs Estiu: Laboratori 2
Curs Estiu: Laboratori 2
Carles Mateu
Curs Estiu: Laboratori 3
Curs Estiu: Laboratori 3Curs Estiu: Laboratori 3
Curs Estiu: Laboratori 3
Carles Mateu
Curs Estiu: Laboratori 0
Curs Estiu: Laboratori 0Curs Estiu: Laboratori 0
Curs Estiu: Laboratori 0
Carles Mateu
Microblogs
MicroblogsMicroblogs
Microblogs
Carles Mateu
Xarxes Socials
Xarxes SocialsXarxes Socials
Xarxes Socials
Carles Mateu
Introducció als Blogs
Introducció als BlogsIntroducció als Blogs
Introducció als Blogs
Carles Mateu
Felicitacio
FelicitacioFelicitacio
Felicitacio
Carles Mateu
Màster Enginyeria Programari Lliure
Màster Enginyeria Programari LliureMàster Enginyeria Programari Lliure
Màster Enginyeria Programari Lliure
Carles Mateu
Visions Professionals Programari Lliure
Visions Professionals Programari LliureVisions Professionals Programari Lliure
Visions Professionals Programari Lliure
Carles Mateu
Universitat Estiu: Introducció Programari Lliure
Universitat Estiu: Introducció Programari LliureUniversitat Estiu: Introducció Programari Lliure
Universitat Estiu: Introducció Programari Lliure
Carles Mateu

Dai 09-ruby on rails

  • 1. DAI: Módul 9 Ruby on Rails Xavier Noguero Carles Mateu http://carlesm.com Ciències de la Computació i Intel·ligència Artificial Universitat de Lleida
  • 2. Ruby on Rails, què és? Ruby és un llenguatge de programació. Rails és un “framework” modern que fa molt fàcil el desenvolupament i manteniment d'aplicacions web. Molt escollit per crear aplicacions Web 2.0!!
  • 3. Ruby on Rails, perquè? Java? PHP? .NET? Molta feina per a desenvolupar...
  • 4. Rails, és fàcil! Tècniques modernes i professionals. Un exemple: Patró Model-Vista-Controlador En Java: Struts, Tapestry...
  • 5. Amb Ruby i Rails: L'esquelet de ó es crea automàticament.
  • 6. Només ens cal crear el codi just de la lògica de negoci.
  • 7. Tests, es creen ܳٴdzàپԳ!
  • 8. La base, Ruby És un llenguatge interpretat orientat a objectes.
  • 9. No és nou, va ser creat als anys 90 per un japonés, en Yukihiro Matsumoto.
  • 10. S'ha fet popular durant els últims anys a mesura que han aparegut llibres i documentació en anglès.
  • 11. (i en gran mesura gràcies a Rails).
  • 12. irb, un shell interactiu de Ruby És intérpret de comandes que es pot utilitzar per a testejar codi ràpidament:
  • 13. rdoc, per a fer documentació És l'eina que ens permet generar la documentació del codi que escrivim: Es pot especificar de quin o quins fitxers volem que es generi la documentació.
  • 14. El format de sortida és HTML.
  • 15. RubyGems És l'eina per a gestionar el sistema de paquets de Ruby: Un format estàndard per a distribuir programes i llibreries Ruby.
  • 16. Gestiona la instalació de paquets gem (de manera similar com ara yum o apt-get per a distros linux).
  • 17. Rails is Agile L'any 2001, 17 crítics dels models de desenvolupament de programari, van signar l'Agile Manifesto. http://agilemanifesto.org/ Aquest, defineix nous mètodes de desenvolupament de programari com una alternativa a les metodologies formals existents, considerades massa “pesades” i rígides pel seu caràcter normatiu i la seva alta dependència en les planificacions prèvies a l'etapa de desenvolupament.
  • 18. Alguns exemples: Extreme Programming, Scrum...
  • 19. Rails, per tal com s'ha concebut, segueix aquestes pràctiques!
  • 20. Extremme Programing (XP) Considerada per molts com “la manera com realment volen treballar els programadors”
  • 21. Es basa principalment en: Fer releases petites i freqüents.
  • 23. Implementar només el que hi ha l'especificació.
  • 24. Escriure sempre primer el codi de test.
  • 25. Seguir la planificació de manera realista.
  • 28. Programar en parelles, i intercanviar rols dins el projecte, per tal que tothom conegui millor el codi.
  • 29. Arquitectura MVC Patró Model-Vista-Controlador
  • 30. Arquitectura MVC - Model Patró Model-Vista-Controlador Model: Part responsable de mantenir l'estat de ó.
  • 31. Engloba: Dades: manipulació de bases de dades, fitxers, etc.
  • 32. Regles per mantenir coherents les dades en tot moment.
  • 33. Arquitectura MVC - Vista Patró Model-Vista-Controlador Vista: Part responsable de generar la interfície d'usuari.
  • 34. Accedeix al model per a presentar les dades a l'usuari de ó
  • 35. Arquitectura MVC - Controlador Patró Model-Vista-Controlador Controlador: Part responsable d'orquestrar el funcionament de ó.
  • 36. Rep events de l'usuari, interacciona amb el model i tria una vista adecuada per a donar resposta de nou a l'usuari.
  • 37. Rails és un framework M-V-C Patró Model-Vista-Controlador amb Rails: Model: Active Record
  • 38. Vista i controlador: Action Pack
  • 39. Les URL's amb Rails Imaginem una URL d'una aplicació web Rails: En aquest exemple: laNostraAplicacio.com : adreça base de ó.
  • 40. Saludar : és el controlador.
  • 41. hello : és l'acció que s'executarà. Per tant, les URL's en Rails es mapegen a controladors i accions!
  • 42. Programant Ruby on Rails Primer hem d'instal·lar les eines adients: Ruby
  • 43. Ruby on Rails (Gem)
  • 44. Base de dades (SQLITE3, MySQL)
  • 45. Servidor Web Opcions: Bitnami: ( http://bitnami.org ) Kits de programació (Stacks) per Linux/Windows/Mac/Solaris
  • 50. La primera aplicació Rails Eines de Desenvolupament: Aptana RadRails ( http://www.radrails.org )
  • 57. Programant Ruby on Rails Eines de Desenvolupament: Aptana RadRails ( http://www.radrails.org )
  • 64. La primera aplicació Crearem una aplicació que mantindrà una base de dades de Restaurants, una de crítics.
  • 65. Tindrem a més crítiques per cada restaurant, amb puntuació.
  • 66. Farem les crítiques amb AJAX (sense recarregar planes).
  • 67. Serà una aplicació à辱岹.
  • 68. No correcta (només per anar fent a classe).
  • 69. La primera aplicació Instal·lem el rubystack.
  • 70. Dins de rubystack: ./rubyconsole
  • 71. Això carrega variables d'entorn. Crearem ara ó. Ho farem a: projects/ (dins de rubystack).
  • 72. La primera aplicació Creem aplicació:
  • 74. Baretos és el nom de ó
  • 75. Crearà amb SQLITE3 per defecte. Per mysql:
  • 76. rails -d mysql baretos
  • 77. El creem amb SQLITE3.
  • 78. La primera aplicació Podem provar ó creada:
  • 80. Això arranca un servidor web (mongrel) al port 3000 i desplega la nostra aplicació. Ens hi connectem amb el navegador:
  • 82. La primera aplicació Començarem generant un model pels restaurants.
  • 83. Podríem començar generant un controlador, etc.
  • 84. El restaurant tindrà: nom: Nom del restaurant.
  • 85. adreca: Adreça del carrer. script/generate scaffold restaurant nom:string adreca:string
  • 86. bash-4.0$ script/generate scaffold restaurant nom:string adreca:string lng:float lat:float exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/restaurants exists app/views/layouts/ exists test/functional/ exists test/unit/ create test/unit/helpers/ exists public/stylesheets/ create app/views/restaurants/index.html.erb create app/views/restaurants/show.html.erb create app/views/restaurants/new.html.erb create app/views/restaurants/edit.html.erb create app/views/layouts/restaurants.html.erb create public/stylesheets/scaffold.css create app/controllers/restaurants_controller.rb create test/functional/restaurants_controller_test.rb create app/helpers/restaurants_helper.rb create test/unit/helpers/restaurants_helper_test.rb route map.resources :restaurants dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/restaurant.rb create test/unit/restaurant_test.rb create test/fixtures/restaurants.yml create db/migrate create db/migrate/20100511103805_create_restaurants.rb bash-4.0$
  • 87. bash-4.0$ script/generate scaffold restaurant nom:string adreca:string lng:float lat:float exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/restaurants exists app/views/layouts/ exists test/functional/ exists test/unit/ create test/unit/helpers/ exists public/stylesheets/ create app/views/restaurants/index.html.erb create app/views/restaurants/show.html.erb create app/views/restaurants/new.html.erb create app/views/restaurants/edit.html.erb create app/views/layouts/restaurants.html.erb create public/stylesheets/scaffold.css create app/controllers/restaurants_controller.rb create test/functional/restaurants_controller_test.rb create app/helpers/restaurants_helper.rb create test/unit/helpers/restaurants_helper_test.rb route map.resources :restaurants dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/restaurant.rb create test/unit/restaurant_test.rb create test/fixtures/restaurants.yml create db/migrate create db/migrate/20100511103805_create_restaurants.rb bash-4.0$ VISTA CONTROLADOR MODEL
  • 88. La primera aplicació Tenim a més un mecanisme de migració (actualització) de la Base de Dades.
  • 92. I anem al navegador ( http://localhost:3000/restaurants/ )
  • 93. La primera aplicació Generem també un model pels nostres crítics de restaurant.
  • 94. El crític tindrà: nom: Nom del restaurant.
  • 95. email: Adreça de mail script/generate scaffold critic nom:string email:string rake db:migrate
  • 96. Com funciona? app/ controllers/ restaurants_controller.rb models/ restaurant.rb views/ restaurants/ show.html.erb Segueix REST http://localhost:3000/restaurants/1 Controlador RestaurantsController Vista show Model Restaurant
  • 97. La primera aplicació Els recursos que farem accessibles per REST declarats a config/routes.rb:
  • 100. Les rutes que queden aleshores (rake routes): critics GET /critics(.:format) {:action=>"index", :controller=>"critics"} POST /critics(.:format) {:action=>"create", :controller=>"critics"} new_critic GET /critics/new(.:format) {:action=>"new", :controller=>"critics"} edit_critic GET /critics/:id/edit(.:format) {:action=>"edit", :controller=>"critics"} critic GET /critics/:id(.:format) {:action=>"show", :controller=>"critics"} PUT /critics/:id(.:format) {:action=>"update", :controller=>"critics"} DELETE /critics/:id(.:format) {:action=>"destroy", :controller=>"critics"} restaurants GET /restaurants(.:format) {:action=>"index", :controller=>"restaurants"} POST /restaurants(.:format) {:action=>"create", :controller=>"restaurants"} new_restaurant GET /restaurants/new(.:format) {:action=>"new", :controller=>"restaurants"} edit_restaurant GET /restaurants/:id/edit(.:format) {:action=>"edit", :controller=>"restaurants"} restaurant GET /restaurants/:id(.:format) {:action=>"show", :controller=>"restaurants"} PUT /restaurants/:id(.:format) {:action=>"update", :controller=>"restaurants"} DELETE /restaurants/:id(.:format) {:action=>"destroy", :controller=>"restaurants"} /:controller/:action/:id /:controller/:action/:id(.:format)
  • 101. La primera aplicació Això provoca crides al Controller (app/controllers/restaurants_controller.rb): class RestaurantsController < ApplicationController # GET /restaurants # GET /restaurants.xml def index @restaurants = Restaurant.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @restaurants } end end # GET /restaurants/1 # GET /restaurants/1.xml def show @restaurant = Restaurant.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @restaurant } end end [....deletia....] end
  • 102. La primera aplicació El Model (app/models/restaurant.rb):
  • 103. i la db:migrate (db/migrate/....create_restaurants.rb): class Restaurant < ActiveRecord::Base end class CreateRestaurants < ActiveRecord::Migration def self.up create_table :restaurants do |t| t.string :nom t.string :adreca t.timestamps end end def self.down drop_table :restaurants end end
  • 104. La primera aplicació El respond_to crida la vista (apps/views/restaurants/show.html.erb): <p> <b>Nom:</b> <%=h @restaurant.nom %> </p> <p> <b>Adreca:</b> <%=h @restaurant.adreca %> </p> <p> <b>Lng:</b> <%=h @restaurant.lng %> </p> <p> <b>Lat:</b> <%=h @restaurant.lat %> </p> <%= link_to 'Edit', edit_restaurant_path(@restaurant) %> | <%= link_to 'Back', restaurants_path %>
  • 105. Validació de dades ------> app/models/critic.rb class Critic < ActiveRecord::Base validates_presence_of :nom end ------> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom end Validarem ara les dades:
  • 107. validates_associated, validates_confirmation_of, validates_format_of, validates_length_of, validates_uniqueness_of, ...
  • 109. Vinculació de dades Ara lligarem crítics i restaurants (via la crítica que facin):
  • 110. script/generate resource resenya restaurant_id:integer critic_id:integer puntuacio:decimal comentari:string
  • 112. Important restaurant_id (amb aquest nom exacte) és refereix a l'identificador de cada restaurant.
  • 113. Vinculació de dades Declarem les associacions al model: ----> app/models/resenya.rb class Resenya < ActiveRecord::Base belongs_to :restaurant belongs_to :critic end ----> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :critics, :through => :resenyas end ----> app/models/critic.rb class Critic < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :restaurants, :through => :resenyas end
  • 114. Lògica d'aplicació Afegim al model (restaurants) dos funcions: ----> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :critics, :through => :resenyas def mitja_punts resenyas.average(:puntuacio) || BigDecimal(&quot;0.0&quot;) end def suspes? mitja_punts < 5 end end
  • 115. Tests Rails proporciona entorn de test unitari. Afegim a test/unit/restaurant_test.rb: ----> test/unit/restaurant_test.rb require 'test_helper' class RestaurantTest < ActiveSupport::TestCase def test_notes restaurant = Restaurant.new(:nom=>&quot;Prova&quot;) restaurant.resenyas.build(:puntuacio=>0.5) restaurant.resenyas.build(:puntuacio=>0.5) assert restaurant.save assert_equal BigDecimal(&quot;0.5&quot;), restaurant.mitja_punts assert restaurant.suspes? end test &quot;the truth&quot; do assert false end end
  • 116. Plantilles parcials Permeten pintar “troços”. Pintarem resenyes sota cada restaurant.
  • 117. Creem un fitxer app/views/restaurants/_resenyas.erb _ és important
  • 118. Plantilles parcials ----> app/views/restaurants/_resenyas.erb <table> <% for resenya in resenyas -%> <tr id=&quot;<%= dom_id(resenya ) %>&quot;> <td> <%= link_to resenya.critic.nom, resenya.critic %> </td> <td align=&quot;right&quot;> <%= number_with_precision(resenya.puntuacio, :precision => 1) %> </td> </tr> <% end -%> <tr> <td align=&quot;right&quot; colspan=&quot;2&quot;> <strong>Mitja</strong>: <%= number_with_precision(restaurant.mitja_punts, :precision => 1) %> </td> </tr> </table>
  • 119. Plantilles parcials Afegim ara el display de la plantilla parcial. Al final de app/views/restaurants/show.html.erb: ----> app/views/restaurants/show.html.erb [....] <h3>Resenyes</h3> <div id=&quot;resenyas&quot;> <%= render :partial => 'resenyas', :locals => {:resenyas=> @restaurant.resenyas, :restaurant => @restaurant} %> </div> </table>
  • 120. Sub-Forms Afegirem ara l'entrada de resenyes a la pantalla de restaurants. Modificarem la funció show al controlador. ----> app/controllers/restaurants_controller.rb [....] # GET /restaurants/1 # GET /restaurants/1.xml def show @restaurant = Restaurant.find(params[:id]) @resenya = Resenya.new @critics = Critics.find(:all, :order=>'nom') respond_to do |format| format.html # show.html.erb format.xml { render :xml => @restaurant } end end [...]
  • 122. Això fara que interactuem amb les resenyes sempre via un restaurant. ----> config/routes.rb [....] map.resources :restaurants, :has_many=> :resenyas [...]
  • 123. Sub-Forms Afegim a sota del show de restaurants: ----> app/views/restaurants/show.html.erb [...] <h3>Afegir resenya al restaurant</h3> <p style=&quot;color: red&quot;><%= flash[:error] %></p> <% form_for [@restaurant, @resenya] do |f| -%> <p> <%= f.collection_select :critic_id, @critics, :id, :nom%> puntua amb <%= f.text_field :puntuacio, :size => 3 %> <br /> i comenta <%= f.text_field :comentari %> </p> <%= f.submit 'Afegir Resenya' %> <% end -%>
  • 124. Sub-Forms Creem métode per controlar creació: ----> app/controllers/resenyas_controller.rb class ResenyasController < ApplicationController def create @restaurant= Restaurant.find(params[:restaurant_id]) @resenya = @restaurant.resenyas.build(params[:resenya]) respond_to do |format| if @resenya.save flash[:notice] = 'Critica creada OK.' format.html { redirect_to @restaurant } else flash[:error] = @resenya.errors.full_messages.to_sentence format.html { redirect_to @restaurant } end end end end
  • 125. AJAX Farem que la plana no recarregui al afegir crítiques i farem animació.
  • 128. Modifiquem la vista: app/views/restaurants/show.html, canviant form_for per remote_form_for:
  • 129. <% remote_form_for [@restaurant, @resenya] do |f| -%>
  • 130. AJAX Canviem l'acció create al controlador de resenyes: ----> app/controllers/resenyas_controller.rb class ResenyasController < ApplicationController def create @restaurant= Restaurant.find(params[:restaurant_id]) @resenya = @restaurant.resenyas.build(params[:resenya]) respond_to do |format| if @resenya.save flash[:notice] = 'Critica creada OK.' format.html { redirect_to @restaurant } format.js # Javascript create.js.rjs else #ELIMINAR flash[:error] = @resenya.errors.full_messages.to_sentence format.html { redirect_to @restaurant } format.js do render :update do |page| page.redirect_to @restaurant end end end end end end
  • 131. AJAX Creem ara create.js.rjs
  • 132. Posem la puntuació en un SPAN amb id = mitja ----> app/views/resenyas/create.js.rjs page[:resenyas].replace_html :partial => 'restaurants/resenyas', :locals => {:resenyas=> @restaurant.resenyas, :restaurant => @restaurant} page[@resenya].highlight page[:mitja].highlight ----> app/views/restaurants/_resenyas.erb <% end -%> <tr> <td align=&quot;right&quot; colspan=&quot;2&quot;> <strong>Mitja</strong>: <span id=&quot;mitja&quot;> <%= number_with_precision(restaurant.mitja_punts, :precision => 1) %> </span> </td> </tr> </table>
  • 133. Webgrafia i Bibliografia Ruby i Ruby on Rails: http://rubyonrails.org/
  • 135. http://www.rubyonrails.org.es Programming Ruby 1.9: The Pragmatic Programmers' Guide: http://www.pragprog.com/titles/ruby3/programming-ruby-1-9 Agile Web Development with Rails, Third Edition: http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition

Editor's Notes

  • #9: La creació d&apos;una classe ha de comportar aquests tres passos: Escriure la lògica de l&apos;aplicació en pseudo-codi. Escriure els tests. Escriure el codi Java final d&apos;acord amb els tests. Perquè escriure primer els tests? Ens ajuda a saber que ha de fer cada mètode. Permet validar que el codi escrit, funciona. Quan afegim codi nou es passen tots els tests, així assegurem el funcionament del codi previ ja testejat. Nota: podem aprofitar el fet que cada classe pot tenir un mètode main per situar-hi els tests.
  • #10: La creació d&apos;una classe ha de comportar aquests tres passos: Escriure la lògica de l&apos;aplicació en pseudo-codi. Escriure els tests. Escriure el codi Java final d&apos;acord amb els tests. Perquè escriure primer els tests? Ens ajuda a saber que ha de fer cada mètode. Permet validar que el codi escrit, funciona. Quan afegim codi nou es passen tots els tests, així assegurem el funcionament del codi previ ja testejat. Nota: podem aprofitar el fet que cada classe pot tenir un mètode main per situar-hi els tests.