Slide 1

Slide 1 text

Action 4 in @kentaro

Slide 2

Slide 2 text

@kentaro Software engineer to build technical basis Rubyist / Perl Monger Kentaro Kuribayashi paperboy&co.

Slide 3

Slide 3 text

http://twitter.com/kentaro http://github.com/kentaro Twitter GitHub

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Triglav Server Management Tool

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Still at alpha stage

Slide 9

Slide 9 text

• Server management tool • Minimalistic features • Provides API to retrieve hosts, etc. • Copes with complicated demands with loose-coupled architecture • Written in Rails 4

Slide 10

Slide 10 text

Living on the Edge

Slide 11

Slide 11 text

$ rails new myapp --edge $ ruby /path/to/rails/railties/bin/rails new myapp --dev Rails command Locally cloned command

Slide 12

Slide 12 text

• Living on the Edge Rails is harder than you might imagine ;) • You’ll often get stuck into various problems around Rails eco-system

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

The stories above are only applicable to Edge Rails, furthermore it is being to the major version up now! CAVEAT

Slide 18

Slide 18 text

• As a result, I got to know more about Rails internal • I recommend you should be into it once at least :)

Slide 19

Slide 19 text

It’s a highly recommendabl e book for those who want to know Rails internal

Slide 20

Slide 20 text

what’s new in Rails4? So...,

Slide 21

Slide 21 text

Edge Guides http://edgeguides.rubyonrails.org/ Edge API Reference http://edgeapi.rubyonrails.org/ Rails4 Release Notes http://edgeguides.rubyonrails.org/4_0_release_notes.html Rails 4 compilation links http://blog.wyeworks.com/2012/11/13/rails-4-compilation-links/

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

http://blog.wyeworks.com/2012/11/13/rails-4-compilation-links/

Slide 24

Slide 24 text

No big changes, but too many newly introduced and removed/deprecated features...

Slide 25

Slide 25 text

I’ll talk to you about the Rails4 changes from my point of view, that is, changes which I bumped into actually while developing Triglav with Edge Rails these days. It must be also applicable to any other common web apps.

Slide 26

Slide 26 text

Rails Guides now got responsive design!

Slide 27

Slide 27 text

class ApplicationController add_flash_types :success, :error end <% if error %> <%= error %> <% elsif success %> <%= success %> <% end %> redirect_to ‘/foo’, error: 'message' add_flash_types view controller

Slide 28

Slide 28 text

Web routes viewer bundled in Rails4 (taken from Sextant)

Slide 29

Slide 29 text

concern :commentable do resources :comments, only: [:create] end resources :services, constraints: { id: /[^\/]+/ }, concerns: [:commentable] resources :roles, constraints: { id: /[^\/]+/ }, concerns: [:commentable] resources :hosts, constraints: { id: /[^\/]+/ }, concerns: [:commentable] concern # instead of `root to: ‘main#index’` root ‘main#index’ root ...

Slide 30

Slide 30 text

create_table :messages do |t| t.references :person end add_index :messages, :person_id index option create_table :messages do |t| t.references :person, index: true end We never neglect to add indices!

Slide 31

Slide 31 text

create_join_table :products, :categories create join table create_table :categories_products, :id => false do |td| td.integer :product_id, :null => false td.integer :category_id, :null => false end

Slide 32

Slide 32 text

<%= content_tag_for(:tr, @posts) do |post| %> ... scaffold generator now use `content_tag_for` <% @posts.each do |post| %> ... `content_tag_for` automatically adds `id` attribute along with active record object. It’s very useful.

Slide 33

Slide 33 text

Clunky JavaScript helpers will be removed • button_to_function • link_to_function It might cost you some long time than you’ll expect if you use them heavily

Slide 34

Slide 34 text

find_all_by_* find_last_by_* scoped_by_* find_or_initialize_by_* find_or_create_by_* find_or_create_by_*! AR finder methods where(...) where(...).last where(...) where(...).first_or_initialize where(...).first_or_create where(...).first_or_create!

Slide 35

Slide 35 text

Post.where(comments_count: 10).limit(5) Old style find Post.find(:all, conditions: { comments_count: 10 }, limit: 5)

Slide 36

Slide 36 text

active_record_deprecate_finders ... can be written as below for now, until Rails5: Post.scoped(:where => { :comments_count => 10 }, :limit => 5) Post.where(comments_count: 10).limit(5) “The code to implement the deprecated features has been moved out to the active_record_deprecated_finders gem. This gem is a dependency of Active Record in Rails 4.0. It will no longer be a dependency from Rails 4.1, but if your app relies on the deprecated features then you can add it to your own Gemfile. It will be maintained by the Rails core team until Rails 5.0 is released.” -- Rails4 Release Notes

Slide 37

Slide 37 text

Strong Parameters

Slide 38

Slide 38 text

From Rails 4, controllers have responsibility to secure mass assignment instead of models.

Slide 39

Slide 39 text

class Person < ActiveRecord::Base attr_accessible :name, :age end attr_accessible (Old Way) “Before Strong Parameters arrived, mass-assignment protection was a model's task provided by Active Model. This has been extracted to the ProtectedAttributes gem. In order to use attr_accessible and attr_protected helpers in your models, you should add protected_attributes to your Gemfile.” Ruby On Rails Security Guide http://edgeguides.rubyonrails.org/security.html

Slide 40

Slide 40 text

class Person < ActiveRecord::Base include ActiveModel::ForbiddenAttributesProtection end class PeopleController < ActionController::Base def create Person.create(person_params) end private def person_params params.require(:person).permit(:name, :age) end end ActionController::Parameters

Slide 41

Slide 41 text

class Person has_many :pets accepts_nested_attributes_for :pets end # PeopleController def person_params params.require(:person).permit( :name, :age, pets_attributes: [ :name, :category ] ) end accepts_nested_attribute_for Pass *_attributes as an Array

Slide 42

Slide 42 text

# PeopleController def person_params params.require(:person).permit( :name, :age, pets_attributes: [ :name, :category :id, :_destroy ] ) end accepts_nested_attribute_for Both :id and :_destroy seem to be needed to update/delete nested models

Slide 43

Slide 43 text

Queue API

Slide 44

Slide 44 text

job = MyJob.new Rails.queue.push(job) class MyJob def run # do something end end Define job Enqueue it Job class must have only run method

Slide 45

Slide 45 text

Default queue is synchronous # To use async queue config.queue = ActiveSupport::Queue.new

Slide 46

Slide 46 text

“The basic queue that comes with Rails is not a long-term solution. The goal here is to establish a common API that more robust queueing systems can plug themselves into. In most cases you shouldn't need to change any of your app code if you want to switch from Resque toSidekiq. You should take care that the objects you are enqueing can be properly marshalled.” http://reefpoints.dockyard.com/ruby/2012/06/25/rails-4-sneak-peek-queueing.html Rails 4.0 Sneak Peek: Queueing

Slide 47

Slide 47 text

ActionController::Live

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Works fine with “Server-Sent Events” “This specification defines an API for opening an HTTP connection for receiving push notifications from a server in the form of DOM events. The API is designed such that it can be extended to work with other push notification schemes such as Push SMS.” http://www.w3.org/TR/eventsource/ W3C: Server-Sent Events

Slide 50

Slide 50 text

“I thought streaming was already introduced in Rails 3.2. How is this different? Yes, streaming templates were added to Rails 3.2. The main difference between Live Streaming and Streaming Templates is that with Streaming Template, the application developer could not choose what data was sent to the client and when. Live Streaming gives the application developer full control of what data is sent to the client and when.” http://tenderlovemaking.com/2012/07/30/is-it-live.html IS IT LIVE?

Slide 51

Slide 51 text

See my chat example using SSE for detailed usage of Queue API and ActionController::Live https://github.com/kentaro/rails4-chat

Slide 52

Slide 52 text

DEMO https://github.com/kentaro/rails4-chat

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

config.allow_concurrency = true config.preload_frameworks = true # Same as calling `config.threadsafe!`, # but it’ll be deprecated from Rails4 config.cache_classes = true config.eager_load = true Allow parallel requests # Gemfile gem ‘puma’ $ bundle exec puma

Slide 55

Slide 55 text

RECAP • Living on the Edge Rails is fun and good lesson • Rails4 is really promising and exciting • Try Rails4 as soon as possible! • I’m wating for your commit to Triglav ;)

Slide 56

Slide 56 text

Any Questions?