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

766 views
630 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
766
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 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.
  • 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.
  • 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>

    ×