0
Présentationtechnico-commercialedeRubyonRailsYann Klis, juin 2013
RubyonRails
RubyonRails
interprété> 1 + 1=> 2
gestiondelamémoireGarbageCollector
orientéobjetpur> 1 + 1=> 2> 1.send(:+, 1)=> 2
orientéobjetpur> nil.nil ?=> true
orientéobjetpur> true.class=> TrueClass
dynamique> ary = []=> []> ary.class.class_eval {attr_accessor :total_entries}=> nil> ary.total_entries = 42=> 42> ary.tota...
class Printingdef method_missing(m, *args)if (name = /^test_(.+)$/.match(m.id2name))print name[1]endendEnd> printing = Pri...
blocklambda, fonction anonyme, etc.> ["a","b","c"].each_with_index{|element,i|puts i}012
blocklambda, fonction anonyme, etc.> ["a", "b", "c"].map{|element|element.upcase}=> ["A", "B", "C"]
lisibilité> 5.times { print "Odelay!" }> Exit unless "restaurant".include?("aura")> [toast, cheese, wine].each{|food|print...
Ruby ?QuelRuby ?1.8.71.9.32.0.0
Ruby ?QuelRuby ?1.8.7 MRI1.9.3 MRI2.0.0 MRIrbx 2.0.0JRuby 1.7.4
rbenvrvm# rbenv list1.8.7-p3581.9.3-p3922.0.0-p0* 2.0.0-p195 (set by /home/yannski/.rbenv/version)
rbenv# rbenv install jruby-1.7.4# rbenv local jruby-1.7.4
bundler&Gemfilesource https://rubygems.orggem rails, 4.0.0gem rails-i18ngem sass-rails, ~> 4.0.0gem haml-rails, >= 4.0.0ge...
RubyonRails
ModelViewController
ModelViewController
ConventionoverConfiguration
ConventionoverConfiguration
environments# ls -l config/environments/development.rbproduction.rbtest.rb
DRY
DRYDont Repeat Yourself
ActiveRecordM in MVC
class Product < ActiveRecord::BaseendActiveRecord / migrationsclass CreateProducts < ActiveRecord::Migrationdef changecrea...
ActiveRecord / migrationsmysql> show tables;+---------------------------------+| Tables_in_monapppli_development |+-------...
irb(main):001:0> product = Product.new=> #<Product id: nil, name: nil, description: nil, created_at: nil, updated_at: nil>...
irb(main):004:0> Product.count(0.5ms) SELECT COUNT(*) FROM `products`=> 1irb(main):005:0> Product.firstProduct Load (0.5ms...
> Product.where(name: "Macbook")Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=...
class Productvalidates_presence_of :nameendActiveRecord / validationsclass CreateProducts < ActiveRecord::Migrationdef cha...
> product = Product.new=> #<Product id: nil, name: nil, description: nil, created_at: nil, updated_at: nil>> product.save(...
class Productvalidates_presence_of :namebelongs_to :categoryendActiveRecord / associationsapp/models/product.rbclass Categ...
class Productbefore_validate :reformatbefore_save :check_nameafter_save :rebuild_categoryafter_destroy :destroy_category_i...
ActiveModelActiveModel::ModelActiveModel::CallbacksActiveModel::ValidationsActiveModel::DirtyActiveModel::AttributeMethods...
Routing
Restful
assetpipeline
//= require jquery//= require jquery_ujs//= require jquery-ui//= require bootstrap//= require bootstrap-datepicker//= requ...
*= require "custombootstrap"*= require "fontawesome"*= require "datepicker"*= require_selfapp/assets/stylesheets/applicati...
ActiveSupport
> "Je suis à la gare".blank ?=> falseActiveSupport
> "".present?=> falseActiveSupport
> "Je suis à la gare".parameterize=> "je-suis-a-la-gare"ActiveSupport
> "John était allongé à la table duncafé quand soudain le loupapparu.".truncate(22)=> "John était allongé …"ActiveSupport
ActionView
products.html.erbproducts.html.hamlmovies.json.erbmovies.xml.builderActionView
TestTests unitaires des models, des controllers, des helpersTests fonctionnels (rspec, capybara, etc.)
railsconsole
> Product.where(name: "Macbook")Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=...
railsserver
railsgenerate
debugger
i18n
CommunautéRubyUnecertainementalité,certes...
rakemake en ruby
capistranodéploiement
rubygems.orgrepository centralisé des gems
deviseauthentification
omniauthomniauth-facebook, omniauth-twitter,omniauth-dailymotion, omniauth-github, ...
paperclipupload de fichiers, stockage, thumbnails, etc.
will_paginatepagination
state_machinemachine à états...
airbrakegestion des exceptions
resquegestion des jobs asynchrones(backend Redis)
ApprendreRailshttp://railsforzombies.org/http://guides.rubyonrails.org/Formation (chez Novelys!)
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-rails
Prochain SlideShare
Chargement dans... 5
×

Presentation technico-commercial-ruby-on-rails

1,083

Published on

Published in: Technologies
4 commentaires
1 mention J'aime
Statistiques
Remarques
  • @rchampourlier je pense que la communauté Ruby/Rails a été la première à introduire très tôt tout un tas de bonnes pratiques, et a été la première à tester et mettre en place des technos connexes (MongoDB, Redis, AWS, Heroku, Chef, etc). Ce n'est pas un hasard si Github, Heroku ou Chef viennent du monde Ruby. Globalement, le rubyiste a plus tendance à avoir une bonne veille techno, indispensable à l'ingéniosité (attention, il y a aussi des rubyistes vieux dans leur tête ;)
       Répondre 
    Êtes-vous sûr de vouloir  Oui  Non
    Votre message apparaîtra ici
  • @novelys Merci pour ta réponse !

    [attention:troll-risky]Dois-je comprendre de ta dernière phrase que la communauté RoR est très en avance sur l'ingéniosité ?[/attention] ;)

    Je comprends bien ta réponse en effet et je m'y attendais. Je tentais le coup quand même pour voir si quelqu'un avec de l'expérience dans le domaine pouvait avancer quelques pions sur le sujet, mais c'est clair que c'est beaucoup trop complexe pour être réduit à un comparatif de chiffrages !
       Répondre 
    Êtes-vous sûr de vouloir  Oui  Non
    Votre message apparaîtra ici
  • @rchampourlier le problème du coût c'est qu'il englobe bien plus que la technologie : le mindset, les bonnes pratiques réellement appliquées, l'expérience de l'équipe, l'ingéniosité de l'équipe (et dans le cas d'une startup, c'est extrêmement important), la cohésion de l'équipe (le graph/intégrateur sait-il produire un combo haml/sass ?). Le seul truc que je peux dire, c'est que la communauté Ruby et Rails est plutôt très en avance sur ces sujets.
       Répondre 
    Êtes-vous sûr de vouloir  Oui  Non
    Votre message apparaîtra ici
  • Merci d'avoir partagé cette présentation ! C'est intéressant de voir présenté Ruby On Rails dans ce contexte ('public cible était les chefs de projet ou les développeurs qui se demandent si Ruby on Rails peut répondre à leurs problématiques'), et c'est utile de voir ce que tu mets en avant.

    J'aurai aussi aimé trouver un retour d'expérience / une comparaison de Rails avec d'autres frameworks du point de vue des coûts de développement initial et de maintenance sur des 'projets types', si tu as des idées à ce sujet je serai ravi de t'écouter ;)
       Répondre 
    Êtes-vous sûr de vouloir  Oui  Non
    Votre message apparaîtra ici
Aucun téléchargement
Vues
Total des vues
1,083
Sur Slideshare
0
À partir des ajouts
0
Nombre d'ajouts
2
Actions
Partages
0
Téléchargements
12
Commentaires
4
J'aime
1
Ajouts 0
No embeds

No notes for slide

Transcript of "Presentation technico-commercial-ruby-on-rails"

  1. 1. Présentationtechnico-commercialedeRubyonRailsYann Klis, juin 2013
  2. 2. RubyonRails
  3. 3. RubyonRails
  4. 4. interprété> 1 + 1=> 2
  5. 5. gestiondelamémoireGarbageCollector
  6. 6. orientéobjetpur> 1 + 1=> 2> 1.send(:+, 1)=> 2
  7. 7. orientéobjetpur> nil.nil ?=> true
  8. 8. orientéobjetpur> true.class=> TrueClass
  9. 9. dynamique> ary = []=> []> ary.class.class_eval {attr_accessor :total_entries}=> nil> ary.total_entries = 42=> 42> ary.total_entries=> 42
  10. 10. class Printingdef method_missing(m, *args)if (name = /^test_(.+)$/.match(m.id2name))print name[1]endendEnd> printing = Printing.new> printing.test_hello=> "hello"> printing.test_pipo=> "pipo"dynamique
  11. 11. blocklambda, fonction anonyme, etc.> ["a","b","c"].each_with_index{|element,i|puts i}012
  12. 12. blocklambda, fonction anonyme, etc.> ["a", "b", "c"].map{|element|element.upcase}=> ["A", "B", "C"]
  13. 13. lisibilité> 5.times { print "Odelay!" }> Exit unless "restaurant".include?("aura")> [toast, cheese, wine].each{|food|print food.capitalize}
  14. 14. Ruby ?QuelRuby ?1.8.71.9.32.0.0
  15. 15. Ruby ?QuelRuby ?1.8.7 MRI1.9.3 MRI2.0.0 MRIrbx 2.0.0JRuby 1.7.4
  16. 16. rbenvrvm# rbenv list1.8.7-p3581.9.3-p3922.0.0-p0* 2.0.0-p195 (set by /home/yannski/.rbenv/version)
  17. 17. rbenv# rbenv install jruby-1.7.4# rbenv local jruby-1.7.4
  18. 18. bundler&Gemfilesource https://rubygems.orggem rails, 4.0.0gem rails-i18ngem sass-rails, ~> 4.0.0gem haml-rails, >= 4.0.0gem mongoid, github: mongoid/mongoid
  19. 19. RubyonRails
  20. 20. ModelViewController
  21. 21. ModelViewController
  22. 22. ConventionoverConfiguration
  23. 23. ConventionoverConfiguration
  24. 24. environments# ls -l config/environments/development.rbproduction.rbtest.rb
  25. 25. DRY
  26. 26. DRYDont Repeat Yourself
  27. 27. ActiveRecordM in MVC
  28. 28. class Product < ActiveRecord::BaseendActiveRecord / migrationsclass CreateProducts < ActiveRecord::Migrationdef changecreate_table :products do |t|t.string :namet.text :descriptiont.timestampsendendenddb/migrate/20130626120509_create_products.rbapp/models/product.rb
  29. 29. ActiveRecord / migrationsmysql> show tables;+---------------------------------+| Tables_in_monapppli_development |+---------------------------------+| products || schema_migrations |+---------------------------------+2 rows in set (0.00 sec)mysql> describe schema_migrations;+---------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| version | varchar(255) | NO | PRI | NULL | |+---------+--------------+------+-----+---------+-------+1 row in set (0.00 sec)mysql> select * from schema_migrations;+----------------+| version |+----------------+| 20130626120509 |+----------------+1 row in set (0.00 sec)
  30. 30. irb(main):001:0> product = Product.new=> #<Product id: nil, name: nil, description: nil, created_at: nil, updated_at: nil>irb(main):002:0> product.name = "Macbook"=> "Macbook"irb(main):003:0> product.save(0.4ms) BEGINSQL (0.3ms) INSERT INTO `products` (`created_at`, `name`, `updated_at`) VALUES(2013-06-26 12:08:17, Macbook, 2013-06-26 12:08:17)(4.7ms) COMMIT=> trueActiveRecord / migrations
  31. 31. irb(main):004:0> Product.count(0.5ms) SELECT COUNT(*) FROM `products`=> 1irb(main):005:0> Product.firstProduct Load (0.5ms) SELECT `products`.* FROM `products` ORDER BY`products`.`id` ASC LIMIT 1=> #<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-2612:08:17", updated_at: "2013-06-26 12:08:17">irb(main):006:0> Product.where(name: "Macbook")Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=> #<ActiveRecord::Relation [#<Product id: 1, name: "Macbook", description: nil,created_at: "2013-06-26 12:08:17", updated_at: "2013-06-26 12:08:17">]>irb(main):008:0> Product.where(name: "Macbook").firstProduct Load (0.7ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook ORDER BY `products`.`id` ASC LIMIT 1=> #<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-2612:08:17", updated_at: "2013-06-26 12:08:17">ActiveRecord / query
  32. 32. > Product.where(name: "Macbook")Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=> #<ActiveRecord::Relation [#<Product id: 1, name: "Macbook", description: nil,created_at: "2013-06-26 12:08:17", updated_at: "2013-06-26 12:08:17">]>> Product.where(name: "Macbook").to_aProduct Load (0.4ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=> [#<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-2612:08:17", updated_at: "2013-06-26 12:08:17">]ActiveRecord / query
  33. 33. class Productvalidates_presence_of :nameendActiveRecord / validationsclass CreateProducts < ActiveRecord::Migrationdef changecreate_table :products do |t|t.string :namet.text :descriptiont.timestampsendendenddb/migrate/20130626120509_create_products.rbapp/models/product.rb
  34. 34. > product = Product.new=> #<Product id: nil, name: nil, description: nil, created_at: nil, updated_at: nil>> product.save(0.3ms) BEGIN(0.2ms) ROLLBACK=> false> product.errors=> #<ActiveModel::Errors:0x007f2f9fb1bec8 @base=#<Product id: nil, name: nil,description: nil, created_at: nil, updated_at: nil>, @messages={:name=>["cant beblank"]}>ActiveRecord / validations
  35. 35. class Productvalidates_presence_of :namebelongs_to :categoryendActiveRecord / associationsapp/models/product.rbclass Categoryhas_many :productsendapp/models/category.rb
  36. 36. class Productbefore_validate :reformatbefore_save :check_nameafter_save :rebuild_categoryafter_destroy :destroy_category_if_emptyendActiveRecord / life cycleapp/models/product.rb
  37. 37. ActiveModelActiveModel::ModelActiveModel::CallbacksActiveModel::ValidationsActiveModel::DirtyActiveModel::AttributeMethodsActiveModel::SerializationActiveModel::Translation
  38. 38. Routing
  39. 39. Restful
  40. 40. assetpipeline
  41. 41. //= require jquery//= require jquery_ujs//= require jquery-ui//= require bootstrap//= require bootstrap-datepicker//= require jquery_nested_form//= require ckeditor/init//= require_tree .app/assets/javascripts/application.jsasset pipeline
  42. 42. *= require "custombootstrap"*= require "fontawesome"*= require "datepicker"*= require_selfapp/assets/stylesheets/application.css.scssasset pipeline
  43. 43. ActiveSupport
  44. 44. > "Je suis à la gare".blank ?=> falseActiveSupport
  45. 45. > "".present?=> falseActiveSupport
  46. 46. > "Je suis à la gare".parameterize=> "je-suis-a-la-gare"ActiveSupport
  47. 47. > "John était allongé à la table duncafé quand soudain le loupapparu.".truncate(22)=> "John était allongé …"ActiveSupport
  48. 48. ActionView
  49. 49. products.html.erbproducts.html.hamlmovies.json.erbmovies.xml.builderActionView
  50. 50. TestTests unitaires des models, des controllers, des helpersTests fonctionnels (rspec, capybara, etc.)
  51. 51. railsconsole
  52. 52. > Product.where(name: "Macbook")Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=> #<ActiveRecord::Relation [#<Product id: 1, name: "Macbook", description: nil,created_at: "2013-06-26 12:08:17", updated_at: "2013-06-26 12:08:17">]>> Product.where(name: "Macbook").to_aProduct Load (0.4ms) SELECT `products`.* FROM `products` WHERE`products`.`name` = Macbook=> [#<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-2612:08:17", updated_at: "2013-06-26 12:08:17">]ActiveRecord / query
  53. 53. railsserver
  54. 54. railsgenerate
  55. 55. debugger
  56. 56. i18n
  57. 57. CommunautéRubyUnecertainementalité,certes...
  58. 58. rakemake en ruby
  59. 59. capistranodéploiement
  60. 60. rubygems.orgrepository centralisé des gems
  61. 61. deviseauthentification
  62. 62. omniauthomniauth-facebook, omniauth-twitter,omniauth-dailymotion, omniauth-github, ...
  63. 63. paperclipupload de fichiers, stockage, thumbnails, etc.
  64. 64. will_paginatepagination
  65. 65. state_machinemachine à états...
  66. 66. airbrakegestion des exceptions
  67. 67. resquegestion des jobs asynchrones(backend Redis)
  68. 68. ApprendreRailshttp://railsforzombies.org/http://guides.rubyonrails.org/Formation (chez Novelys!)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×