Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
DAI: Módul 9 Ruby on Rails Xavier Noguero Carles Mateu   http://carlesm.com Ciències de la Computació i Intel·ligència Art...
Ruby on Rails, què és? <ul><li>Ruby és un llenguatge de programació. </li></ul><ul><li>Rails és un “framework” modern que ...
Ruby on Rails, perquè? <ul><li>Java? PHP? .NET?  Molta feina per a desenvolupar...
Rails, és fàcil! </li><ul><li>Tècniques modernes i professionals. </li></ul><li>Un exemple: Patró Model-Vista-Controlador ...
Amb Ruby i Rails: </li><ul><li>L'esquelet de l'aplicació es crea automàticament.
Només ens cal crear el codi just de la lògica de negoci.
Tests, es creen automàticament! </li></ul></ul></ul>
La base, Ruby <ul><li>É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). </li></ul>
irb, un shell interactiu de Ruby <ul><li>És intérpret de comandes que es pot utilitzar per a testejar codi ràpidament: </l...
rdoc, per a fer documentació <ul><li>És l'eina que ens permet generar la documentació del codi que escrivim: </li></ul><ul...
El format de sortida és HTML. </li></ul>
RubyGems <ul><li>És l'eina per a gestionar el sistema de paquets de Ruby: </li></ul><ul><ul><li>Un format estàndard per a ...
Gestiona la instalació de paquets gem (de manera similar com ara yum o apt-get per a distros linux). </li></ul></ul>
Rails is Agile <ul><li>L'any 2001, 17 crítics dels models de desenvolupament de programari, van signar l'Agile Manifesto. ...
Alguns exemples: Extreme Programming, Scrum...
Rails, per tal com s'ha concebut, segueix aquestes pràctiques! </li></ul>
Extremme Programing (XP) <ul><li>Considerada per molts com “la manera com realment volen treballar els programadors”
Es basa principalment en: </li><ul><li>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. </li></ul></ul>
Arquitectura MVC <ul><li>Patró Model-Vista-Controlador </li></ul>
Arquitectura MVC - Model <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Model: </li><ul><li>Part responsable de m...
Engloba: </li><ul><li>Dades: manipulació de bases de dades, fitxers, etc.
Regles per mantenir coherents les dades en tot moment. </li></ul></ul></ul>
Arquitectura MVC - Vista <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Vista: </li><ul><li>Part responsable de g...
Accedeix al model per a presentar les dades a l'usuari de l'aplicació </li></ul></ul>
Arquitectura MVC - Controlador <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Controlador: </li><ul><li>Part resp...
Rep events de l'usuari, interacciona amb el model i tria una vista adecuada per a donar resposta de nou a l'usuari. </li><...
Rails és un framework M-V-C <ul><li>Patró Model-Vista-Controlador amb Rails: </li></ul><ul><li>Model: Active Record
Vista i controlador: Action Pack </li></ul>
Les URL's amb Rails <ul><li>Imaginem una URL d'una aplicació web Rails: </li></ul><ul><li>En aquest exemple: </li><ul><li>...
Saludar : és el controlador.
hello : és l'acció que s'executarà. </li></ul></ul><ul><li>Per tant, les URL's en Rails es mapegen a controladors i accion...
Programant Ruby on Rails <ul><li>Primer hem d'instal·lar les eines adients: </li><ul><li>Ruby
Ruby on Rails (Gem)
Base de dades (SQLITE3, MySQL)
Servidor Web </li></ul><li>Opcions: </li><ul><li>Bitnami: ( http://bitnami.org ) Kits de programació (Stacks) per Linux/Wi...
Locomotive (Mac)
InstantRails (Windows)
Distribució (Linux)
Upcoming SlideShare
Loading in …5
×

Dai 09-ruby on rails

  • Login to see the comments

  • Be the first to like this

Dai 09-ruby on rails

  1. 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. 2. Ruby on Rails, què és? <ul><li>Ruby és un llenguatge de programació. </li></ul><ul><li>Rails és un “framework” modern que fa molt fàcil el desenvolupament i manteniment d'aplicacions web. </li></ul><ul><li>Molt escollit per crear aplicacions Web 2.0!! </li></ul>
  3. 3. Ruby on Rails, perquè? <ul><li>Java? PHP? .NET? Molta feina per a desenvolupar...
  4. 4. Rails, és fàcil! </li><ul><li>Tècniques modernes i professionals. </li></ul><li>Un exemple: Patró Model-Vista-Controlador </li><ul><li>En Java: Struts, Tapestry...
  5. 5. Amb Ruby i Rails: </li><ul><li>L'esquelet de l'aplicació es crea automàticament.
  6. 6. Només ens cal crear el codi just de la lògica de negoci.
  7. 7. Tests, es creen automàticament! </li></ul></ul></ul>
  8. 8. La base, Ruby <ul><li>És un llenguatge interpretat orientat a objectes.
  9. 9. No és nou, va ser creat als anys 90 per un japonés, en Yukihiro Matsumoto.
  10. 10. S'ha fet popular durant els últims anys a mesura que han aparegut llibres i documentació en anglès.
  11. 11. (i en gran mesura gràcies a Rails). </li></ul>
  12. 12. irb, un shell interactiu de Ruby <ul><li>És intérpret de comandes que es pot utilitzar per a testejar codi ràpidament: </li></ul>
  13. 13. rdoc, per a fer documentació <ul><li>És l'eina que ens permet generar la documentació del codi que escrivim: </li></ul><ul><li>Es pot especificar de quin o quins fitxers volem que es generi la documentació.
  14. 14. El format de sortida és HTML. </li></ul>
  15. 15. RubyGems <ul><li>És l'eina per a gestionar el sistema de paquets de Ruby: </li></ul><ul><ul><li>Un format estàndard per a distribuir programes i llibreries Ruby.
  16. 16. Gestiona la instalació de paquets gem (de manera similar com ara yum o apt-get per a distros linux). </li></ul></ul>
  17. 17. Rails is Agile <ul><li>L'any 2001, 17 crítics dels models de desenvolupament de programari, van signar l'Agile Manifesto. </li><ul><li>http://agilemanifesto.org/ </li></ul><li>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. 18. Alguns exemples: Extreme Programming, Scrum...
  19. 19. Rails, per tal com s'ha concebut, segueix aquestes pràctiques! </li></ul>
  20. 20. Extremme Programing (XP) <ul><li>Considerada per molts com “la manera com realment volen treballar els programadors”
  21. 21. Es basa principalment en: </li><ul><li>Fer releases petites i freqüents.
  22. 22. Desenvolupar en cicles iteratius.
  23. 23. Implementar només el que hi ha l'especificació.
  24. 24. Escriure sempre primer el codi de test.
  25. 25. Seguir la planificació de manera realista.
  26. 26. Refactoritzar sempre que es pugui.
  27. 27. Fer-ho tot simple.
  28. 28. Programar en parelles, i intercanviar rols dins el projecte, per tal que tothom conegui millor el codi. </li></ul></ul>
  29. 29. Arquitectura MVC <ul><li>Patró Model-Vista-Controlador </li></ul>
  30. 30. Arquitectura MVC - Model <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Model: </li><ul><li>Part responsable de mantenir l'estat de l'aplicació.
  31. 31. Engloba: </li><ul><li>Dades: manipulació de bases de dades, fitxers, etc.
  32. 32. Regles per mantenir coherents les dades en tot moment. </li></ul></ul></ul>
  33. 33. Arquitectura MVC - Vista <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Vista: </li><ul><li>Part responsable de generar la interfície d'usuari.
  34. 34. Accedeix al model per a presentar les dades a l'usuari de l'aplicació </li></ul></ul>
  35. 35. Arquitectura MVC - Controlador <ul><li>Patró Model-Vista-Controlador </li></ul><ul><li>Controlador: </li><ul><li>Part responsable d'orquestrar el funcionament de l'aplicació.
  36. 36. Rep events de l'usuari, interacciona amb el model i tria una vista adecuada per a donar resposta de nou a l'usuari. </li></ul></ul>
  37. 37. Rails és un framework M-V-C <ul><li>Patró Model-Vista-Controlador amb Rails: </li></ul><ul><li>Model: Active Record
  38. 38. Vista i controlador: Action Pack </li></ul>
  39. 39. Les URL's amb Rails <ul><li>Imaginem una URL d'una aplicació web Rails: </li></ul><ul><li>En aquest exemple: </li><ul><li>laNostraAplicacio.com : adreça base de l'aplicació.
  40. 40. Saludar : és el controlador.
  41. 41. hello : és l'acció que s'executarà. </li></ul></ul><ul><li>Per tant, les URL's en Rails es mapegen a controladors i accions! </li></ul>
  42. 42. Programant Ruby on Rails <ul><li>Primer hem d'instal·lar les eines adients: </li><ul><li>Ruby
  43. 43. Ruby on Rails (Gem)
  44. 44. Base de dades (SQLITE3, MySQL)
  45. 45. Servidor Web </li></ul><li>Opcions: </li><ul><li>Bitnami: ( http://bitnami.org ) Kits de programació (Stacks) per Linux/Windows/Mac/Solaris
  46. 46. Locomotive (Mac)
  47. 47. InstantRails (Windows)
  48. 48. Distribució (Linux)
  49. 49. Distribució (Mac) </li></ul></ul>
  50. 50. La primera aplicació Rails <ul><li>Eines de Desenvolupament: </li><ul><li>Aptana RadRails ( http://www.radrails.org )
  51. 51. Xcode ( http://developer.apple.com )
  52. 52. TextMate ( http://macromates.com ) $$
  53. 53. Netbeans ( http://netbeans.org/features/ruby/index.html )
  54. 54. jEdit ( http://www.jedit.org )
  55. 55. Vim ( http://www.vim.org/scripts/script.php?script_id=1567 )
  56. 56. Gedit ( http://github.com/mig/gedit-rails ) </li></ul></ul>
  57. 57. Programant Ruby on Rails <ul><li>Eines de Desenvolupament: </li><ul><li>Aptana RadRails ( http://www.radrails.org )
  58. 58. Xcode ( http://developer.apple.com )
  59. 59. TextMate ( http://macromates.com ) $$
  60. 60. Netbeans ( http://netbeans.org/features/ruby/index.html )
  61. 61. jEdit ( http://www.jedit.org )
  62. 62. Vim ( http://www.vim.org/scripts/script.php?script_id=1567 )
  63. 63. Gedit ( http://github.com/mig/gedit-rails ) </li></ul></ul>
  64. 64. La primera aplicació <ul><li>Crearem una aplicació que mantindrà una base de dades de Restaurants, una de crítics.
  65. 65. Tindrem a més crítiques per cada restaurant, amb puntuació.
  66. 66. Farem les crítiques amb AJAX (sense recarregar planes).
  67. 67. Serà una aplicació ràpida.
  68. 68. No correcta (només per anar fent a classe). </li></ul>
  69. 69. La primera aplicació <ul><li>Instal·lem el rubystack.
  70. 70. Dins de rubystack: </li><ul><li>./rubyconsole
  71. 71. Això carrega variables d'entorn. </li></ul><li>Crearem ara l'aplicació. Ho farem a: projects/ (dins de rubystack). </li></ul>
  72. 72. La primera aplicació <ul><li>Creem aplicació:
  73. 73. rails baretos
  74. 74. Baretos és el nom de l'aplicació
  75. 75. Crearà amb SQLITE3 per defecte. Per mysql:
  76. 76. rails -d mysql baretos
  77. 77. El creem amb SQLITE3. </li></ul>
  78. 78. La primera aplicació <ul><li>Podem provar l'aplicació creada:
  79. 79. script/server
  80. 80. Això arranca un servidor web (mongrel) al port 3000 i desplega la nostra aplicació. Ens hi connectem amb el navegador:
  81. 81. http://localhost:3000/ </li></ul>
  82. 82. La primera aplicació <ul><li>Començarem generant un model pels restaurants.
  83. 83. Podríem començar generant un controlador, etc.
  84. 84. El restaurant tindrà: </li><ul><li>nom: Nom del restaurant.
  85. 85. adreca: Adreça del carrer. </li></ul></ul>script/generate scaffold restaurant nom:string adreca:string
  86. 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. 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. 88. La primera aplicació <ul><li>Tenim a més un mecanisme de migració (actualització) de la Base de Dades.
  89. 89. rake db:migrate
  90. 90. Executem de nou l'aplicació
  91. 91. script/server
  92. 92. I anem al navegador ( http://localhost:3000/restaurants/ ) </li></ul>
  93. 93. La primera aplicació <ul><li>Generem també un model pels nostres crítics de restaurant.
  94. 94. El crític tindrà: </li><ul><li>nom: Nom del restaurant.
  95. 95. email: Adreça de mail </li></ul></ul>script/generate scaffold critic nom:string email:string rake db:migrate
  96. 96. Com funciona? <ul><li>app/ </li><ul><li>controllers/ </li><ul><li>restaurants_controller.rb </li></ul><li>models/ </li><ul><li>restaurant.rb </li></ul><li>views/ </li><ul><li>restaurants/ </li><ul><li>show.html.erb </li></ul></ul></ul><li>Segueix REST </li></ul>http://localhost:3000/restaurants/1 Controlador RestaurantsController Vista show Model Restaurant
  97. 97. La primera aplicació <ul><li>Els recursos que farem accessibles per REST declarats a config/routes.rb:
  98. 98. map.resources :critics
  99. 99. map.resources :restaurants
  100. 100. Les rutes que queden aleshores (rake routes): </li></ul>critics GET /critics(.:format) {:action=>&quot;index&quot;, :controller=>&quot;critics&quot;} POST /critics(.:format) {:action=>&quot;create&quot;, :controller=>&quot;critics&quot;} new_critic GET /critics/new(.:format) {:action=>&quot;new&quot;, :controller=>&quot;critics&quot;} edit_critic GET /critics/:id/edit(.:format) {:action=>&quot;edit&quot;, :controller=>&quot;critics&quot;} critic GET /critics/:id(.:format) {:action=>&quot;show&quot;, :controller=>&quot;critics&quot;} PUT /critics/:id(.:format) {:action=>&quot;update&quot;, :controller=>&quot;critics&quot;} DELETE /critics/:id(.:format) {:action=>&quot;destroy&quot;, :controller=>&quot;critics&quot;} restaurants GET /restaurants(.:format) {:action=>&quot;index&quot;, :controller=>&quot;restaurants&quot;} POST /restaurants(.:format) {:action=>&quot;create&quot;, :controller=>&quot;restaurants&quot;} new_restaurant GET /restaurants/new(.:format) {:action=>&quot;new&quot;, :controller=>&quot;restaurants&quot;} edit_restaurant GET /restaurants/:id/edit(.:format) {:action=>&quot;edit&quot;, :controller=>&quot;restaurants&quot;} restaurant GET /restaurants/:id(.:format) {:action=>&quot;show&quot;, :controller=>&quot;restaurants&quot;} PUT /restaurants/:id(.:format) {:action=>&quot;update&quot;, :controller=>&quot;restaurants&quot;} DELETE /restaurants/:id(.:format) {:action=>&quot;destroy&quot;, :controller=>&quot;restaurants&quot;} /:controller/:action/:id /:controller/:action/:id(.:format)
  101. 101. La primera aplicació <ul><li>Això provoca crides al Controller (app/controllers/restaurants_controller.rb): </li></ul>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. 102. La primera aplicació <ul><li>El Model (app/models/restaurant.rb):
  103. 103. i la db:migrate (db/migrate/....create_restaurants.rb): </li></ul>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. 104. La primera aplicació <ul><li>El respond_to crida la vista (apps/views/restaurants/show.html.erb): </li></ul><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. 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 <ul><li>Validarem ara les dades:
  106. 106. Tenim moltes validacions:
  107. 107. validates_associated, validates_confirmation_of, validates_format_of, validates_length_of, validates_uniqueness_of, ...
  108. 108. http://guides.rubyonrails.org/activerecord_validations_callbacks.html </li></ul>
  109. 109. Vinculació de dades <ul><li>Ara lligarem crítics i restaurants (via la crítica que facin):
  110. 110. script/generate resource resenya restaurant_id:integer critic_id:integer puntuacio:decimal comentari:string
  111. 111. rake db:migrate
  112. 112. Important restaurant_id (amb aquest nom exacte) és refereix a l'identificador de cada restaurant. </li></ul>
  113. 113. Vinculació de dades <ul><li>Declarem les associacions al model: </li></ul>----> 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. 114. Lògica d'aplicació <ul><li>Afegim al model (restaurants) dos funcions: </li></ul>----> 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. 115. Tests <ul><li>Rails proporciona entorn de test unitari. Afegim a test/unit/restaurant_test.rb: </li></ul>----> 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. 116. Plantilles parcials <ul><li>Permeten pintar “troços”. Pintarem resenyes sota cada restaurant.
  117. 117. Creem un fitxer app/views/restaurants/_resenyas.erb </li><ul><li>_ és important </li></ul></ul>
  118. 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. 119. Plantilles parcials <ul><li>Afegim ara el display de la plantilla parcial. Al final de app/views/restaurants/show.html.erb: </li></ul>----> 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. 120. Sub-Forms <ul><li>Afegirem ara l'entrada de resenyes a la pantalla de restaurants. Modificarem la funció show al controlador. </li></ul>----> 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 [...]
  121. 121. Sub-Forms <ul><li>Modifiquem la ruta:
  122. 122. Això fara que interactuem amb les resenyes sempre via un restaurant. </li></ul>----> config/routes.rb [....] map.resources :restaurants, :has_many=> :resenyas [...]
  123. 123. Sub-Forms <ul><li>Afegim a sota del show de restaurants: </li></ul>----> 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. 124. Sub-Forms <ul><li>Creem métode per controlar creació: </li></ul>----> 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. 125. AJAX <ul><li>Farem que la plana no recarregui al afegir crítiques i farem animació.
  126. 126. Afegim a app/views/layouts/restaurants.html, a <head>:
  127. 127. <%= javascript_include_tag :defaults %>
  128. 128. Modifiquem la vista: app/views/restaurants/show.html, canviant form_for per remote_form_for:
  129. 129. <% remote_form_for [@restaurant, @resenya] do |f| -%> </li></ul>
  130. 130. AJAX <ul><li>Canviem l'acció create al controlador de resenyes: </li></ul>----> 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. 131. AJAX <ul><li>Creem ara create.js.rjs
  132. 132. Posem la puntuació en un SPAN amb id = mitja </li></ul>----> 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. 133. Webgrafia i Bibliografia <ul><li>Ruby i Ruby on Rails: </li><ul><li>http://rubyonrails.org/
  134. 134. http://www.ruby-lang.org/es/
  135. 135. http://www.rubyonrails.org.es </li></ul><li>Programming Ruby 1.9: The Pragmatic Programmers' Guide: </li><ul><li>http://www.pragprog.com/titles/ruby3/programming-ruby-1-9 </li></ul><li>Agile Web Development with Rails, Third Edition: </li><ul><li>http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition </li></ul></ul>

×