Active Support Core Extensions (1)

26
Active Support Core Extensions ROR lab. DD-1 - The 1st round - March 16, 2013 Hyoseong Choi

description

Digging Deeper Chapter in RailsGuides

Transcript of Active Support Core Extensions (1)

Page 1: Active Support Core Extensions (1)

Active SupportCore Extensions

ROR lab. DD-1- The 1st round -

March 16, 2013

Hyoseong Choi

Page 2: Active Support Core Extensions (1)

• Ruby on Rails components

• actionmailer

• actionpack

• activerecord

• activesupport ...

Active Support

Page 3: Active Support Core Extensions (1)

• Ruby on Rails components

• actionmailer

• actionpack

• activerecord

• activesupport ...

Active Support

Page 4: Active Support Core Extensions (1)

Active Support

• Ruby language extensions

• Utility classes

• Other transversal stuff

Page 5: Active Support Core Extensions (1)

Core ExtensionsStand-Alone Active Support

require 'active_support'

“blank?” method

Grouped Core Extensionsrequire 'active_support/core_ext/object'

All Core Extensionsrequire 'active_support/core_ext'

All Active Supportrequire 'active_support/all'

require 'active_support/core_ext/object/blank'

Cherry-picking

Page 6: Active Support Core Extensions (1)

Core ExtensionsActive Support within ROR Application

require 'active_support/all'

Default

config.active_support.bare = true

Barebone setting with Cherry-pickings

Page 10: Active Support Core Extensions (1)

Ext. to All Objects

active_support/core_ext/object/try.rb

• try

def log_info(sql, name, ms)  if @logger.try(:debug?)    name = '%s (%.1fms)' % [name || 'SQL', ms]    @logger.debug(format_log_entry(name, sql.squeeze(' ')))  endend

@person.try { |p| "#{p.first_name} #{p.last_name}" }

• try!

Page 12: Active Support Core Extensions (1)

Singleton Class?• When you add a method to a specific object, Ruby inserts

a new anonymous class into the inheritance hierarchy as a container to hold these types of methods.

http://www.devalot.com/articles/2008/09/ruby-singleton

anonymous

class

foobar = [ ]def foobar.say “Hello”end

Page 13: Active Support Core Extensions (1)

Singleton Class?

http://www.devalot.com/articles/2008/09/ruby-singleton

anonymous

class

module Foo def foo "Hello World!" endend

foobar = []foobar.extend(Foo)foobar.singleton_methods # => ["foo"]

foobar = []

class << foobar def foo "Hello World!" endend

foobar.singleton_methods # => ["foo"]

foobar = []

foobar.instance_eval <<EOT def foo "Hello World!" endEOT foobar.singleton_methods # => ["foo"]

foobar = Array.new

def foobar.size "Hello World!"endfoobar.size # => "Hello World!"foobar.class # => Arraybizbat = Array.newbizbat.size # => 0

Page 14: Active Support Core Extensions (1)

Singleton Class?

http://www.devalot.com/articles/2008/09/ruby-singleton

class Foo def self.one () 1 end class << self def two () 2 end end

def three () 3 end self.singleton_methods # => ["two", "one"] self.class # => Class self # => Fooend

• Practical Uses of Singleton Classes

classmethod

classmethod

anonymous

class

Page 15: Active Support Core Extensions (1)

Ext. to All Objects

active_support/core_ext/kernel/singleton_class.rb

• class_eval(*args, &block)

class Proc  def bind(object)    block, time = self, Time.now    object.class_eval do      method_name = "__bind_#{time.to_i}_#{time.usec}"      define_method(method_name, &block)      method = instance_method(method_name)      remove_method(method_name)      method    end.bind(object)  endend

Page 20: Active Support Core Extensions (1)

Ext. to All Objects

active_support/core_ext/object/with_options.rb

• with_options

class Account < ActiveRecord::Base  has_many :customers, :dependent => :destroy  has_many :products,  :dependent => :destroy  has_many :invoices,  :dependent => :destroy  has_many :expenses,  :dependent => :destroyend

class Account < ActiveRecord::Base  with_options :dependent => :destroy do |assoc|    assoc.has_many :customers    assoc.has_many :products    assoc.has_many :invoices    assoc.has_many :expenses  endend

Page 21: Active Support Core Extensions (1)

Ext. to All Objects

active_support/core_ext/object/with_options.rb

• with_options

I18n.with_options locale: user.locale, scope: "newsletter" do |i18n|  subject i18n.t(:subject)  body    i18n.t(:body, user_name: user.name)end

# app/views/home/index.html.erb<%=t 'greet_username', :user => "Bill", :message => "Goodbye" %> # config/locales/en.ymlen:  greet_username: "%{message}, %{user}!"

http://guides.rubyonrails.org/i18n.html

interpolation key

Page 24: Active Support Core Extensions (1)

Ext. to All Objects

active_support/core_ext/kernel/reporting.rb

• Silencing Warnings, Streams, and Exceptions

silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger }

silence_stream(STDOUT) do  # STDOUT is silent hereend

quietly { system 'bundle install' }

# If the user is locked the increment is lost, no big deal.suppress(ActiveRecord::StaleObjectError) do  current_user.increment! :visitsend

$VERBOSE

even in

subprocessessilencing

exceptions

silencingstreams

Page 26: Active Support Core Extensions (1)

ROR Lab.

�������