presentation technico-commercial-ruby-on-rails

71
Présentation technico-commerciale de Ruby on Rails Yann Klis, juin 2013

Upload: novelys

Post on 10-May-2015

1.059 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Presentation technico-commercial-ruby-on-rails

Présentationtechnico-commerciale

de Ruby on RailsYann Klis, juin 2013

Page 2: Presentation technico-commercial-ruby-on-rails
Page 3: Presentation technico-commercial-ruby-on-rails

RubyonRails

Page 4: Presentation technico-commercial-ruby-on-rails

RubyonRails

Page 5: Presentation technico-commercial-ruby-on-rails

interprété> 1 + 1=> 2

Page 6: Presentation technico-commercial-ruby-on-rails

gestion de la mémoire

Garbage Collector

Page 7: Presentation technico-commercial-ruby-on-rails

orienté objet pur> 1 + 1=> 2> 1.send(:+, 1)=> 2

Page 8: Presentation technico-commercial-ruby-on-rails

orienté objet pur> nil.nil ?=> true

Page 9: Presentation technico-commercial-ruby-on-rails

orienté objet pur> true.class=> TrueClass

Page 10: Presentation technico-commercial-ruby-on-rails

dynamique> ary = []=> []> ary.class.class_eval { attr_accessor :total_entries}=> nil> ary.total_entries = 42=> 42> ary.total_entries=> 42

Page 11: Presentation technico-commercial-ruby-on-rails

class Printing def method_missing(m, *args) if (name = /^test_(.+)$/.match(m.id2name)) print name[1] end endEnd

> printing = Printing.new> printing.test_hello=> "hello"> printing.test_pipo=> "pipo"

dynamique

Page 12: Presentation technico-commercial-ruby-on-rails

blocklambda, fonction anonyme, etc.

> ["a","b","c"].each_with_index{|element,i| puts i}012

Page 13: Presentation technico-commercial-ruby-on-rails

blocklambda, fonction anonyme, etc.

> ["a", "b", "c"].map{|element| element.upcase}=> ["A", "B", "C"]

Page 14: Presentation technico-commercial-ruby-on-rails

lisibilité> 5.times { print "Odelay!" }

> Exit unless "restaurant".include?("aura")

> ['toast', 'cheese', 'wine'].each{|food| print food.capitalize}

Page 15: Presentation technico-commercial-ruby-on-rails

Ruby ? Quel Ruby ?1.8.71.9.32.0.0

Page 16: Presentation technico-commercial-ruby-on-rails

Ruby ? Quel Ruby ?1.8.7 MRI1.9.3 MRI2.0.0 MRIrbx 2.0.0

JRuby 1.7.4

Page 17: Presentation technico-commercial-ruby-on-rails

rbenvrvm

# rbenv list 1.8.7-p358 1.9.3-p392 2.0.0-p0* 2.0.0-p195 (set by /home/yannski/.rbenv/version)

Page 18: Presentation technico-commercial-ruby-on-rails

rbenv# rbenv install jruby-1.7.4 # rbenv local jruby-1.7.4

Page 19: Presentation technico-commercial-ruby-on-rails

bundler & Gemfilesource 'https://rubygems.org'

gem 'rails', '4.0.0'gem 'rails-i18n'gem 'sass-rails', '~> 4.0.0'gem 'haml-rails', '>= 4.0.0'gem 'mongoid', github: 'mongoid/mongoid'

Page 20: Presentation technico-commercial-ruby-on-rails

RubyonRails

Page 21: Presentation technico-commercial-ruby-on-rails

ModelViewController

Page 22: Presentation technico-commercial-ruby-on-rails

ModelViewController

Page 23: Presentation technico-commercial-ruby-on-rails

Conventionover

Configuration

Page 24: Presentation technico-commercial-ruby-on-rails

Conventionover

Configuration

Page 25: Presentation technico-commercial-ruby-on-rails
Page 26: Presentation technico-commercial-ruby-on-rails

environments# ls -l config/environments/development.rbproduction.rbtest.rb

Page 27: Presentation technico-commercial-ruby-on-rails

DRY

Page 28: Presentation technico-commercial-ruby-on-rails

DRYDon't Repeat Yourself

Page 29: Presentation technico-commercial-ruby-on-rails

ActiveRecordM in MVC

Page 30: Presentation technico-commercial-ruby-on-rails

class Product < ActiveRecord::Baseend

ActiveRecord / migrations

class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.text :description

t.timestamps end endend

db/migrate/20130626120509_create_products.rb

app/models/product.rb

Page 31: Presentation technico-commercial-ruby-on-rails

ActiveRecord / migrations

mysql> 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)

Page 32: Presentation technico-commercial-ruby-on-rails

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) BEGIN SQL (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=> true

ActiveRecord / migrations

Page 33: Presentation technico-commercial-ruby-on-rails

irb(main):004:0> Product.count (0.5ms) SELECT COUNT(*) FROM `products`=> 1

irb(main):005:0> Product.first Product 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-26 12: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").first Product 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-26 12:08:17", updated_at: "2013-06-26 12:08:17">

ActiveRecord / query

Page 34: Presentation technico-commercial-ruby-on-rails

> 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_a Product Load (0.4ms) SELECT `products`.* FROM `products` WHERE `products`.`name` = 'Macbook'=> [#<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-26 12:08:17", updated_at: "2013-06-26 12:08:17">]

ActiveRecord / query

Page 35: Presentation technico-commercial-ruby-on-rails

class Product validates_presence_of :nameend

ActiveRecord / validations

class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.text :description

t.timestamps end endend

db/migrate/20130626120509_create_products.rb

app/models/product.rb

Page 36: Presentation technico-commercial-ruby-on-rails

> 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=>["can't be blank"]}>

ActiveRecord / validations

Page 37: Presentation technico-commercial-ruby-on-rails

class Product validates_presence_of :name belongs_to :categoryend

ActiveRecord / associations

app/models/product.rb

class Category has_many :productsend

app/models/category.rb

Page 38: Presentation technico-commercial-ruby-on-rails

class Product

before_validate :reformat

before_save :check_name

after_save :rebuild_category

after_destroy :destroy_category_if_empty

end

ActiveRecord / life cycle

app/models/product.rb

Page 39: Presentation technico-commercial-ruby-on-rails

ActiveModelActiveModel::Model

ActiveModel::CallbacksActiveModel::Validations

ActiveModel::DirtyActiveModel::AttributeMethods

ActiveModel::SerializationActiveModel::Translation

Page 40: Presentation technico-commercial-ruby-on-rails

Routing

Page 41: Presentation technico-commercial-ruby-on-rails

Restful

Page 42: Presentation technico-commercial-ruby-on-rails

asset pipeline

Page 43: Presentation technico-commercial-ruby-on-rails

//= 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.js

asset pipeline

Page 44: Presentation technico-commercial-ruby-on-rails

*= require "custombootstrap"*= require "fontawesome"*= require "datepicker"*= require_self

app/assets/stylesheets/application.css.scss

asset pipeline

Page 45: Presentation technico-commercial-ruby-on-rails

ActiveSupport

Page 46: Presentation technico-commercial-ruby-on-rails

> "Je suis à la gare".blank ?=> false

ActiveSupport

Page 47: Presentation technico-commercial-ruby-on-rails

> "".present?=> false

ActiveSupport

Page 48: Presentation technico-commercial-ruby-on-rails

> "Je suis à la gare".parameterize=> "je-suis-a-la-gare"

ActiveSupport

Page 49: Presentation technico-commercial-ruby-on-rails

> "John était allongé à la table d'un café quand soudain le loup apparu.".truncate(22)=> "John était allongé …"

ActiveSupport

Page 50: Presentation technico-commercial-ruby-on-rails

ActionView

Page 51: Presentation technico-commercial-ruby-on-rails

products.html.erbproducts.html.hamlmovies.json.erbmovies.xml.builder

ActionView

Page 52: Presentation technico-commercial-ruby-on-rails

TestTests unitaires des models, des controllers, des helpersTests fonctionnels (rspec, capybara, etc.)

Page 53: Presentation technico-commercial-ruby-on-rails

rails console

Page 54: Presentation technico-commercial-ruby-on-rails

> 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_a Product Load (0.4ms) SELECT `products`.* FROM `products` WHERE `products`.`name` = 'Macbook'=> [#<Product id: 1, name: "Macbook", description: nil, created_at: "2013-06-26 12:08:17", updated_at: "2013-06-26 12:08:17">]

ActiveRecord / query

Page 55: Presentation technico-commercial-ruby-on-rails

rails server

Page 56: Presentation technico-commercial-ruby-on-rails

rails generate

Page 57: Presentation technico-commercial-ruby-on-rails

debugger

Page 58: Presentation technico-commercial-ruby-on-rails

i18n

Page 59: Presentation technico-commercial-ruby-on-rails

Communauté RubyUne certaine mentalité, certes...

Page 60: Presentation technico-commercial-ruby-on-rails

rakemake en ruby

Page 61: Presentation technico-commercial-ruby-on-rails

capistranodéploiement

Page 62: Presentation technico-commercial-ruby-on-rails

rubygems.orgrepository centralisé des gems

Page 63: Presentation technico-commercial-ruby-on-rails
Page 64: Presentation technico-commercial-ruby-on-rails

deviseauthentification

Page 65: Presentation technico-commercial-ruby-on-rails

omniauthomniauth-facebook, omniauth-twitter,

omniauth-dailymotion, omniauth-github, ...

Page 66: Presentation technico-commercial-ruby-on-rails

paperclipupload de fichiers, stockage, thumbnails, etc.

Page 67: Presentation technico-commercial-ruby-on-rails

will_paginatepagination

Page 68: Presentation technico-commercial-ruby-on-rails

state_machinemachine à états...

Page 69: Presentation technico-commercial-ruby-on-rails

airbrakegestion des exceptions

Page 70: Presentation technico-commercial-ruby-on-rails

resquegestion des jobs asynchrones

(backend Redis)

Page 71: Presentation technico-commercial-ruby-on-rails

Apprendre Railshttp://railsforzombies.org/http://guides.rubyonrails.org/Formation (chez Novelys!)