Your SlideShare is downloading. ×
Presentation technico-commercial-ruby-on-rails
Prochain SlideShare
Chargement dans... 5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Presentation technico-commercial-ruby-on-rails

1,049
views

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,049
Sur Slideshare
0
À partir des ajouts
0
Nombre d'ajouts
2
Actions
Partages
0
Téléchargements
11
Commentaires
4
J'aime
1
Ajouts 0
No embeds

Signaler un contenu
Signalé comme inapproprié Signaler comme inapproprié
Signaler comme inapproprié

Indiquez la raison pour laquelle vous avez signalé cette présentation comme n'étant pas appropriée.

Annuler
No notes for slide

Transcript

  • 1. Présentationtechnico-commercialedeRubyonRailsYann Klis, juin 2013
  • 2. RubyonRails
  • 3. RubyonRails
  • 4. interprété> 1 + 1=> 2
  • 5. gestiondelamémoireGarbageCollector
  • 6. orientéobjetpur> 1 + 1=> 2> 1.send(:+, 1)=> 2
  • 7. orientéobjetpur> nil.nil ?=> true
  • 8. orientéobjetpur> true.class=> TrueClass
  • 9. dynamique> ary = []=> []> ary.class.class_eval {attr_accessor :total_entries}=> nil> ary.total_entries = 42=> 42> ary.total_entries=> 42
  • 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. blocklambda, fonction anonyme, etc.> ["a","b","c"].each_with_index{|element,i|puts i}012
  • 12. blocklambda, fonction anonyme, etc.> ["a", "b", "c"].map{|element|element.upcase}=> ["A", "B", "C"]
  • 13. lisibilité> 5.times { print "Odelay!" }> Exit unless "restaurant".include?("aura")> [toast, cheese, wine].each{|food|print food.capitalize}
  • 14. Ruby ?QuelRuby ?1.8.71.9.32.0.0
  • 15. Ruby ?QuelRuby ?1.8.7 MRI1.9.3 MRI2.0.0 MRIrbx 2.0.0JRuby 1.7.4
  • 16. rbenvrvm# rbenv list1.8.7-p3581.9.3-p3922.0.0-p0* 2.0.0-p195 (set by /home/yannski/.rbenv/version)
  • 17. rbenv# rbenv install jruby-1.7.4# rbenv local jruby-1.7.4
  • 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. RubyonRails
  • 20. ModelViewController
  • 21. ModelViewController
  • 22. ConventionoverConfiguration
  • 23. ConventionoverConfiguration
  • 24. environments# ls -l config/environments/development.rbproduction.rbtest.rb
  • 25. DRY
  • 26. DRYDont Repeat Yourself
  • 27. ActiveRecordM in MVC
  • 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. 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. 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. 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. > 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. 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. > 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. class Productvalidates_presence_of :namebelongs_to :categoryendActiveRecord / associationsapp/models/product.rbclass Categoryhas_many :productsendapp/models/category.rb
  • 36. class Productbefore_validate :reformatbefore_save :check_nameafter_save :rebuild_categoryafter_destroy :destroy_category_if_emptyendActiveRecord / life cycleapp/models/product.rb
  • 37. ActiveModelActiveModel::ModelActiveModel::CallbacksActiveModel::ValidationsActiveModel::DirtyActiveModel::AttributeMethodsActiveModel::SerializationActiveModel::Translation
  • 38. Routing
  • 39. Restful
  • 40. assetpipeline
  • 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. *= require "custombootstrap"*= require "fontawesome"*= require "datepicker"*= require_selfapp/assets/stylesheets/application.css.scssasset pipeline
  • 43. ActiveSupport
  • 44. > "Je suis à la gare".blank ?=> falseActiveSupport
  • 45. > "".present?=> falseActiveSupport
  • 46. > "Je suis à la gare".parameterize=> "je-suis-a-la-gare"ActiveSupport
  • 47. > "John était allongé à la table duncafé quand soudain le loupapparu.".truncate(22)=> "John était allongé …"ActiveSupport
  • 48. ActionView
  • 49. products.html.erbproducts.html.hamlmovies.json.erbmovies.xml.builderActionView
  • 50. TestTests unitaires des models, des controllers, des helpersTests fonctionnels (rspec, capybara, etc.)
  • 51. railsconsole
  • 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. railsserver
  • 54. railsgenerate
  • 55. debugger
  • 56. i18n
  • 57. CommunautéRubyUnecertainementalité,certes...
  • 58. rakemake en ruby
  • 59. capistranodéploiement
  • 60. rubygems.orgrepository centralisé des gems
  • 61. deviseauthentification
  • 62. omniauthomniauth-facebook, omniauth-twitter,omniauth-dailymotion, omniauth-github, ...
  • 63. paperclipupload de fichiers, stockage, thumbnails, etc.
  • 64. will_paginatepagination
  • 65. state_machinemachine à états...
  • 66. airbrakegestion des exceptions
  • 67. resquegestion des jobs asynchrones(backend Redis)
  • 68. ApprendreRailshttp://railsforzombies.org/http://guides.rubyonrails.org/Formation (chez Novelys!)

×