Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ROR Lab. (DD1-1)

ROR Lab. (DD1-1)

Active Support Core Extensions (1), RailsGuides

Avatar for ROR Lab.

ROR Lab.

March 19, 2013
Tweet

More Decks by ROR Lab.

Other Decks in Programming

Transcript

  1. Active Support Core Extensions ROR lab. DD-1 - The 1st

    round - March 16, 2013 Hyoseong Choi
  2. • Ruby on Rails components • actionmailer • actionpack •

    activerecord • activesupport ... Active Support
  3. • Ruby on Rails components • actionmailer • actionpack •

    activerecord • activesupport ... Active Support
  4. Core Extensions Stand-Alone Active Support require 'active_support' “blank?” method Grouped

    Core Extensions require 'active_support/core_ext/object' All Core Extensions require 'active_support/core_ext' All Active Support require 'active_support/all' require 'active_support/core_ext/object/blank' Cherry-picking
  5. Core Extensions Active Support within ROR Application require 'active_support/all' Default

    config.active_support.bare = true Barebone setting with Cherry-pickings
  6. Ext. to All Objects • blank? ‣ nil and false

    ‣ whitespaces : spaces, tabs, newlines ‣ empty arrays and hashes ‣ empty? true • present? ‣ !blank? 0 and 0.0 ! blank active_support/core_ext/object/ blank.rb
  7. Ext. to All Objects • presence host = config[:host].presence ||

    'localhost' active_support/core_ext/object/ blank.rb
  8. Ext. to All Objects active_support/core_ext/object/ duplicable.rb • duplicable? "".duplicable? #

    => true false.duplicable? # => false Singletons : nil, false, true, symobls, numbers, and class and module objects
  9. 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(' '))) end end @person.try { |p| "#{p.first_name} #{p.last_name}" } • try!
  10. 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
  11. Singleton Class? http://www.devalot.com/articles/2008/09/ruby-singleton anonymous class module Foo def foo "Hello

    World!" end end foobar = [] foobar.extend(Foo) foobar.singleton_methods # => ["foo"] foobar = [] class << foobar def foo "Hello World!" end end foobar.singleton_methods # => ["foo"] foobar = [] foobar.instance_eval <<EOT def foo "Hello World!" end EOT foobar.singleton_methods # => ["foo"] foobar = Array.new def foobar.size "Hello World!" end foobar.size # => "Hello World!" foobar.class # => Array bizbat = Array.new bizbat.size # => 0
  12. 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 # => Foo end • Practical Uses of Singleton Classes class method class method anonymous class
  13. 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) end end
  14. Ext. to All Objects active_support/core_ext/object/ acts_likes.rb • acts_like?(duck) some_klass.acts_like?(:string) same

    interface? def acts_like_string? end acts_like_date? (Date class) acts_like_time? (Time class) for example
  15. Ext. to All Objects active_support/core_ext/object/ to_param.rb • to_param(=> to_s) a

    value for :id placeholder class User def to_param "#{id}-#{name.parameterize}" end end user_path(@user) # => "/users/357-john-smith" ➧ => The return value should not be escaped! overwriting
  16. Ext. to All Objects active_support/core_ext/object/ to_query.rb • to_query a value

    for :id placeholder class User def to_param "#{id}-#{name.parameterize}" end end current_user.to_query('user') # => user=357-john-smith ➧ => escaped!
  17. Ext. to All Objects active_support/core_ext/object/ to_query.rb • to_query escaped account.to_query('company[name]')

    # => "company%5Bname%5D=Johnson+%26+Johnson" {:c => 3, :b => 2, :a => 1}.to_query # => "a=1&b=2&c=3" [3.4, -45.6].to_query('sample') # => "sample%5B%5D=3.4&sample%5B%5D=-45.6" {:id => 89, :name => "John Smith"}.to_query('user') # => "user%5Bid%5D=89&user%5Bname%5D=John+Smith"
  18. 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 => :destroy end 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 end end
  19. 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.yml en: greet_username: "%{message}, %{user}!" http://guides.rubyonrails.org/i18n.html interpolation key
  20. Ext. to All Objects active_support/core_ext/object/ with_options.rb • with_options en: activerecord:

    models: user: Dude attributes: user: login: "Handle" # will translate User attribute "login" as "Handle" http://guides.rubyonrails.org/i18n.html scope of i18n config/locales/en.yml
  21. Ext. to All Objects active_support/core_ext/object/ instance_variable.rb • Instance Variables class

    C def initialize(x, y) @x, @y = x, y end end C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
  22. 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 here end quietly { system 'bundle install' } # If the user is locked the increment is lost, no big deal. suppress(ActiveRecord::StaleObjectError) do current_user.increment! :visits end $VERBOSE even in subprocesses silencing exceptions silencing streams
  23. Ext. to All Objects active_support/core_ext/object/ inclusion.rb • in? 1.in?(1,2) #

    => true 1.in?([1,2]) # => true "lo".in?("hello") # => true 25.in?(30..50) # => false 1.in?(1) # => ArgumentError [1,2].include? 1 # => true "hello".include? "lo" # => true (30..50).include? 25 # => false • include? (array method)