+ All Categories
Home > Documents > WebcampZG - Rails 4

WebcampZG - Rails 4

Date post: 14-Jul-2015
Category:
Upload: shnikola
View: 159 times
Download: 0 times
Share this document with a friend
Popular Tags:
76
Rails 4.0 Nikola Šantić
Transcript
Page 1: WebcampZG - Rails 4

Rails 4.0Nikola Šantić

Page 2: WebcampZG - Rails 4

• MVC Web Framework • Verzija 1.0 - prosinac 2005.• “Convention over configuration”, DRY• Najbolji je• 235.000 siteova

Ruby on Rails

Page 3: WebcampZG - Rails 4

• MVC Web Framework • Verzija 1.0 - prosinac 2005.• “Convention over configuration”, DRY• Najbolji je• 235.000 siteova

Ruby on Rails

Page 4: WebcampZG - Rails 4

• MVC Web Framework • Verzija 1.0 - prosinac 2005.• “Convention over configuration”, DRY• Najbolji je• 235.000 siteova

Ruby on Rails

Page 5: WebcampZG - Rails 4

• MVC Web Framework • Verzija 1.0 - prosinac 2005.• “Convention over configuration”, DRY• Najbolji je• 235.000 siteova

Ruby on Rails

Page 6: WebcampZG - Rails 4

• MVC Web Framework • Verzija 1.0 - prosinac 2005.• “Convention over configuration”, DRY• Najbolji je• 235.000 siteova

Ruby on Rails

Page 7: WebcampZG - Rails 4

Promjene

Page 8: WebcampZG - Rails 4

Promjene

verzije commits files changed lines changed

1.2 - 2.0 1,989 1,106 61,774 +38,554 -

2.3 - 3.0 10,000+ 2,334 131,438 +106,109 -

3.0 - 3.1 6,818 1,522 74,115 +62,646 -

3.2 - 4.0? 7,304 2,005 94,231 +92,069 -

Page 9: WebcampZG - Rails 4

Pretpremijera

# Gemfile

# gem 'rails', '3.2.8'gem 'rails', github: 'rails/rails'

$ bundle update

Page 10: WebcampZG - Rails 4

NOVE STVARI

Page 11: WebcampZG - Rails 4

Strong Parameters

Page 12: WebcampZG - Rails 4

# app/models/user.rbclass User < ActiveRecord::Base end

# app/controllers/users_controller.rbclass UsersController < ApplicationController def update # params = {user: {name: 'Nikola', age: 25}} @user = User.find(params[:id]) @user = @user.update_attributes(params[:user]) redirect_to @user endend

Mass assignment

Page 13: WebcampZG - Rails 4

# app/models/user.rbclass User < ActiveRecord::Base end

# app/controllers/users_controller.rbclass UsersController < ApplicationController def update # params = {user: {name: 'Nikola', admin: true}} @user = User.find(params[:id]) @user = @user.update_attributes(params[:user]) redirect_to @user endend

Mass assignment

Page 14: WebcampZG - Rails 4

# app/models/user.rbclass User < ActiveRecord::Base end

# app/controllers/users_controller.rbclass UsersController < ApplicationController def update # params = {user: {name: 'Nikola', admin: true}} @user = User.find(params[:id]) @user = @user.update_attributes(params[:user]) redirect_to @user endend

# @user.admin?# => true

Mass assignment

Page 15: WebcampZG - Rails 4

# app/models/user.rbclass User < ActiveRecord::Base attr_accessible :name end

# app/controllers/users_controller.rbclass UsersController < ApplicationController def update # params = {user: {name: 'Nikola', admin: true}} @user = User.find(params[:id]) @user = @user.update_attributes(params[:user]) redirect_to @user endend

# @user.admin?# => false

Mass assignment

Page 16: WebcampZG - Rails 4

config.active_record.whitelist_attributes = false

Page 17: WebcampZG - Rails 4

# app/models/user.rbclass User < ActiveRecord::Baseend

# app/controllers/users_controller.rbclass UsersController < ApplicationController def update # params = {user: {name: 'Nikola', admin: true}} @user = User.find(params[:id]) @user = @user.update_attributes(user_params) redirect_to @user end

private def user_params params.require(:user).permit(:name) end end

Strong parameters

Page 18: WebcampZG - Rails 4

params.require(:user).permit(:name, :email, :password)

Strong parameters

Page 19: WebcampZG - Rails 4

params.require(:user).permit(:name, :email, :password)

Strong parameters

POST /usersparams = {username: ‘Budala’}

Page 20: WebcampZG - Rails 4

params.require(:user).permit(:name, :email, :password)

Strong parameters

POST /usersparams = {username: ‘Budala’}

<= 400 Bad Request

Page 21: WebcampZG - Rails 4

params.require(:user).permit(:name, :email, :password)

Strong parameters

POST /usersparams = {user: {name: ‘Nikola’, admin: true}}

Page 22: WebcampZG - Rails 4

params.require(:user).permit(:name, :email, :password)

Strong parameters

POST /usersparams = {user: {name: ‘Nikola’, admin: true}}

<= 201 CREATED

User.find_by_name(‘Nikola’).admin?=> false

Page 23: WebcampZG - Rails 4

# app/controllers/users_controller.rbclass UsersController < ApplicationController def user_params params.require(:user).permit(:name) end end

# app/controllers/admin/users_controller.rbclass Admin::UsersController < ApplicationController def user_params params.require(:user).permit(User.attribute_names) end end

Višestruke uloge

Page 24: WebcampZG - Rails 4

https://github.com/rails/strong_parameters

Dostupan već danas!

Page 25: WebcampZG - Rails 4

ActiveSupport::Queue

Page 26: WebcampZG - Rails 4

• delayed_job• Resque• Sidekiq• ...

Background job - Prije

Page 27: WebcampZG - Rails 4

class ExpensiveOperation def run # ... endend

Rails.queue.push(ExpensiveOperation.new)

Background job - Sada

Page 28: WebcampZG - Rails 4

config.queue = :asynchronousconfig.queue = :synchronous

config.queue = :resque

Podešavanje

Page 29: WebcampZG - Rails 4

config.action_mailer.async = true

Asinkroni ActionMailer

Page 30: WebcampZG - Rails 4

ActionController::Live

Page 31: WebcampZG - Rails 4

class MyController < ActionController::Base def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

Page 32: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

Page 33: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

WEBrick

Page 34: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

WEBrick

Page 35: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

WEBrick Unicorn

Page 36: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

WEBrick Unicorn

Page 37: WebcampZG - Rails 4

class MyController < ActionController::Base include ActionController::Live def index 100.times { response.stream.write "hello world\n" } response.stream.close endend

Streaming

WEBrick UnicornRainbows

PumaThin

Page 38: WebcampZG - Rails 4

Rails 4.0 > Node.js ?

Page 39: WebcampZG - Rails 4

STARE STVARI

Page 40: WebcampZG - Rails 4

Cache Digest

Page 41: WebcampZG - Rails 4

@user

Babuška caching

@project

@project

@task

@task

@task

Page 42: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache [ 'v1', @user ] do %> <h1> <%= @user.name %> </h1> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache [ 'v1', project ] do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache [ 'v1', task ] do %> Todo: <%= task.content %><% end %>

Babuška caching

Page 43: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache [ 'v1', @user ] do %> <h1> <%= @user.name %> </h1> <p> Vaši projekti: </p> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache [ 'v1', project ] do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache [ 'v1', task ] do %> Todo: <%= task.content %><% end %>

Babuška caching

Page 44: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache [ 'v2', @user ] do %> <h1> <%= @user.name %> </h1> <p> Vaši projekti: </p> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache [ 'v1', project ] do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache [ 'v1', task ] do %> Todo: <%= task.content %><% end %>

Babuška caching

Page 45: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache [ 'v2', @user ] do %> <h1> <%= @user.name %> </h1> <p> Vaši projekti: </p> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache [ 'v1', project ] do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache [ 'v1', task ] do %> Todo: <%= task.content %> Date: <%= task.date %><% end %>

Babuška caching

Page 46: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache [ 'v3', @user ] do %> <h1> <%= @user.name %> </h1> <p> Vaši projekti: </p> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache [ 'v2', project ] do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache [ 'v2', task ] do %> Todo: <%= task.content %> Date: <%= task.date %><% end %>

Babuška caching

Page 47: WebcampZG - Rails 4

<%# app/views/users/show.html.erb %><% cache @user do %> <h1> <%= @user.name %> </h1> <%= render @user.projects %><% end %>

<%# app/views/projects/_project.html.erb %><% cache project do %> <%= project.description %> <%= render project.tasks %><% end %>

<%# app/views/tasks/_task.html.erb %><% cache task do %> Todo: <%= task.content %><% end %>

Sada

Page 48: WebcampZG - Rails 4

Čarolijom! (+ koristi MD5 templatea i partiala

kao cache key)

Kako???

Page 49: WebcampZG - Rails 4

https://github.com/rails/cache_digests

Dostupan već danas!

Page 50: WebcampZG - Rails 4

Routing concerns

Page 51: WebcampZG - Rails 4

BCX::Application.routes.draw do resources :messages { resources :comments } resources :forwards { resources :comments } resources :uploads { resources :comments }end

Prije

Page 52: WebcampZG - Rails 4

BCX::Application.routes.draw do concern :commentable do resources :comments end

resources :messages, :forwards, :uploads, concerns: :commentableend

Sada

Page 53: WebcampZG - Rails 4

https://github.com/rails/routing_concerns

Dostupan već danas!

Page 54: WebcampZG - Rails 4

ActiveRecord::Relation

Page 55: WebcampZG - Rails 4

User.firstUser.last

Prvi koji?

Page 56: WebcampZG - Rails 4

User.firstUser.last

Prvi koji?

Sortirani po id-u

SELECT "users".* FROM "users" ORDER BY id LIMIT 1

Page 57: WebcampZG - Rails 4

Koji svi?

User.allVraća ActiveRecord::Relation objekt

Page 58: WebcampZG - Rails 4

Koji svi?

User.allVraća ActiveRecord::Relation objekt

@users = User.all@users = @users.where(name: params[:name]) if params[:name]@users = @users.order(params[:sort_by]) if params[:sort_by]

Page 59: WebcampZG - Rails 4

Nikoji, eto koji

User.noneNull objekt koji se dalje može ulančavati

Page 60: WebcampZG - Rails 4

I još

User.(metoda)!

Page 61: WebcampZG - Rails 4

I još

User.(metoda)!

@users = User.all@users = @users.where(name: params[:name]) if params[:name]@users = @users.order(params[:sort_by]) if params[:sort_by]

Prije:

Page 62: WebcampZG - Rails 4

I još

User.(metoda)!

@users = User.all@users = @users.where(name: params[:name]) if params[:name]@users = @users.order(params[:sort_by]) if params[:sort_by]

Prije:

@users = [email protected]!(name: params[:name]) if params[:name]@users.order!(params[:sort_by]) if params[:sort_by]

Sada:

Page 63: WebcampZG - Rails 4

ZBOGOM STVARI

Page 64: WebcampZG - Rails 4

Zbogom Ruby 1.8

Page 65: WebcampZG - Rails 4

Zbogomfind(:all, :conditions => ...)

Page 66: WebcampZG - Rails 4

ZbogomActiveRecord:SessionStore

Page 67: WebcampZG - Rails 4

ZbogomActiveResource

Page 68: WebcampZG - Rails 4

ZbogomRails::Plugin

Page 69: WebcampZG - Rails 4

ZbogomRails::Plugin

• u /lib folder • pretvori u gem

Page 70: WebcampZG - Rails 4

• Turbolinks• Cached schema dump• HTTP PATCH• HTML5 helperi• config.threadsafe!

Još STO stvari

Page 71: WebcampZG - Rails 4

• Rails 3.1 - gotov• Rails 3.2 - neka deprecation upozorenja, podrška do 4.1• Rails 4.0 - deprecation upozorenja• Rails 4.1 - uklanjanje deprecated dijelova

Verzioniranje

Page 72: WebcampZG - Rails 4

Kad izlazi?

Page 73: WebcampZG - Rails 4

http://edgeguides.rubyonrails.org/4_0_release_notes.html

Dodatna literatura

Page 75: WebcampZG - Rails 4

Pitanja?

Page 76: WebcampZG - Rails 4

Hvala na pažnji!


Recommended