railties @ ruby mastersconf - 2011.02.26

164
Carlos Antonio @cantoniodasilva blog.plataformatec.com.br RAILTIES OU COMO DESENVOLVER PLUGINS/GEMS PARA RAILS Sunday, November 6, 11

description

Railties presentation at Ruby MastersConf 2011.

Transcript of railties @ ruby mastersconf - 2011.02.26

Page 1: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILTIESOU

COMO DESENVOLVER PLUGINS/GEMS PARA RAILS

Sunday, November 6, 11

Page 2: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

$ WHOAMI

Sunday, November 6, 11

Page 3: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

CARLOS ANTONIO DA SILVA

@cantoniodasilva

Sunday, November 6, 11

Page 4: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

COMECEI COM DESENVOLVIMENTO EM 2003

E COM RUBY E RAILS EM 2007

Sunday, November 6, 11

Page 5: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

TRABALHO NA

Sunday, November 6, 11

Page 6: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Sunday, November 6, 11

Page 7: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Sunday, November 6, 11

Page 8: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Sunday, November 6, 11

Page 9: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

THE ROAD SO FAR

RAILS 2.3

Sunday, November 6, 11

Page 10: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Já possuía a estrutura de Rails Engine.

Sunday, November 6, 11

Page 11: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Já possuía a estrutura de Rails Engine.

Mas...

Sunday, November 6, 11

Page 12: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Já possuía a estrutura de Rails Engine.

Mas... podemos dizer que era uma boa “gambiarra”.

Sunday, November 6, 11

Page 13: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpg

Sunday, November 6, 11

Page 14: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

module Rails class Plugin

# Engines are plugins with an app/ directory. def engine? has_app_directory? end private

def has_app_directory? File.directory?(File.join(directory, 'app')) end endend

https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb

Sunday, November 6, 11

Page 15: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.

Sunday, November 6, 11

Page 16: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.

Mas eram fixos, não existia a possibilidade de nenhuma configuração de paths.

Sunday, November 6, 11

Page 17: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3module Rails class Plugin

def view_path File.join(directory, 'app', 'views') end

def controller_path File.join(directory, 'app', 'controllers') end

def routing_file File.join(directory, 'config', 'routes.rb') end

private def app_paths [ File.join(directory, 'app', 'models'), File.join(directory, 'app', 'helpers'), controller_path, metal_path ] end endend

https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb

Sunday, November 6, 11

Page 18: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper...

Sunday, November 6, 11

Page 19: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper...

Que poderiam quebrar a cada novo patch release do Rails.

Sunday, November 6, 11

Page 20: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Não existia uma API pública definida para outros frameworks se integrarem.

Sunday, November 6, 11

Page 21: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Não existia uma API pública definida para outros frameworks se integrarem.

A solução: alias method chain / monkey patch.

Sunday, November 6, 11

Page 22: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpg

Sunday, November 6, 11

Page 23: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

O Rails sabia da existência do ActiveRecord...

Sunday, November 6, 11

Page 24: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

O Rails sabia da existência do ActiveRecord...

Pois era ele o responsável por inicializar o ActiveRecord e os demais frameworks.

Sunday, November 6, 11

Page 25: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Isso quer dizer que, por mais que você estivesse utilizando o DataMapper ou MongoMapper, por

exemplo, o ActiveRecord sempre estaria lá.

Sunday, November 6, 11

Page 26: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3module Rails class Initializer # Requires all frameworks specified by the Configuration#frameworks # list. By default, all frameworks (Active Record, Active Support, # Action Pack, Action Mailer, and Active Resource) are loaded. def require_frameworks configuration.frameworks.each { |framework| require(framework.to_s) } end

def load_observers if gems_dependencies_loaded && configuration.frameworks.include?(:active_record) ActiveRecord::Base.instantiate_observers end end

def initialize_database if configuration.frameworks.include?(:active_record) ActiveRecord::Base.configurations = configuration.database_configuration ActiveRecord::Base.establish_connection end end endend

Sunday, November 6, 11

Page 27: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

module Rails class Configuration

private

def default_frameworks [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] end

endend

Sunday, November 6, 11

Page 28: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SINGLERESPONSIBILITY

PRINCIPLE

RAILS 2.3

Sunday, November 6, 11

Page 29: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SINGLERESPONSIBILITY

PRINCIPLE

RAILS 2.3

Sunday, November 6, 11

Page 30: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 2.3

Sunday, November 6, 11

Page 31: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

NOW

RAILS 3

Sunday, November 6, 11

Page 32: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

Modularidade.

API pública e bem definida.

Sunday, November 6, 11

Page 33: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

HOOKS!

http://www.flickr.com/photos/ooh_food/3304708302/

Sunday, November 6, 11

Page 34: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

O Rails não conhece o ActiveRecord.

Sunday, November 6, 11

Page 35: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

O Rails não conhece o ActiveRecord.

O ActiveRecord é quem conta para o Rails como ele deve ser inicializado.

Sunday, November 6, 11

Page 36: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

E isso acontece com todos os outros frameworks.

Sunday, November 6, 11

Page 37: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

E isso acontece com todos os outros frameworks.

ActiveRecord

ActionMailer

ActionController

ActionView

ActiveResource

Sunday, November 6, 11

Page 38: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

E isso acontece com todas as demais gems/plugins que se integram com o Rails.

Sunday, November 6, 11

Page 39: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

E isso acontece com todas as demais gems/plugins que se integram com o Rails.

DataMapper

Devise

RSpec

Mongoid

outros...

Sunday, November 6, 11

Page 40: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

EXEMPLO REAL???

Sunday, November 6, 11

Page 41: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

module ActiveRecord class Railtie < Rails::Railtie config.active_record = ActiveSupport::OrderedOptions.new

config.generators.orm :active_record, :migration => true, :timestamps => true

config.app_middleware.insert_after "::ActionDispatch::Callbacks", "ActiveRecord::QueryCache"

rake_tasks do load "active_record/railties/databases.rake" end

console do ActiveRecord::Base end

initializer "active_record.logger" do ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger } end

config.after_initialize do ActiveSupport.on_load(:active_record) do instantiate_observers # .... end end endend

https://github.com/rails/rails/tree/3-0-stable/activerecord

Sunday, November 6, 11

Page 42: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SINGLERESPONSIBILITY

PRINCIPLE

RAILS 3

Sunday, November 6, 11

Page 43: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

WIN!!!http://www.flickr.com/photos/simoncopping/5050597808/

Sunday, November 6, 11

Page 44: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

Railties

WTF???

Sunday, November 6, 11

Page 45: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

Railties

WTF???WTF???

Sunday, November 6, 11

Page 46: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Sunday, November 6, 11

Page 47: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Engine

Sunday, November 6, 11

Page 48: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Application Engine

Sunday, November 6, 11

Page 49: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Application

Initialization

Engine

Sunday, November 6, 11

Page 50: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Application

Initialization

Engine

Generators

Sunday, November 6, 11

Page 51: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RailtiesWTF???

Application

Initialization

Engine

Generators

HOOKSSunday, November 6, 11

Page 52: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???CONFIGURAÇÃO

Sunday, November 6, 11

Page 53: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

CONFIGURAÇÃO

https://github.com/plataformatec/responders

module Responders class Railtie < ::Rails::Railtie

config.responders = ActiveSupport::OrderedOptions.new

# Na configuração da app (application.rb): # config.responders.flash_keys = [:notice, :failure] endend

Sunday, November 6, 11

Page 54: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???GENERATORS

Sunday, November 6, 11

Page 55: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

module MyGem class Railtie < ::Rails::Railtie

generators do require "my_gem/generator" end

endend

Sunday, November 6, 11

Page 56: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

Preciso realmente adicionar na Railtie?

Sunday, November 6, 11

Page 57: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

Preciso realmente adicionar na Railtie?

Não, se você seguir a convenção.

Sunday, November 6, 11

Page 58: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

https://github.com/plataformatec/simple_form

simple_form lib generators simple_form install_generator.rb templates simple_form.rb

rails generate simple_form:install

Sunday, November 6, 11

Page 59: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

https://github.com/plataformatec/simple_form

simple_form lib generators simple_form install_generator.rb templates simple_form.rb

Namespace

Generator

rails generate simple_form:install

Sunday, November 6, 11

Page 60: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

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

module SimpleForm module Generators class InstallGenerator < Rails::Generators::Base desc "Copy SimpleForm default files" source_root File.expand_path('../templates', __FILE__)

def copy_initializers copy_file 'simple_form.rb', 'config/initializers/simple_form.rb' end end endend

rails generate simple_form:install

Sunday, November 6, 11

Page 61: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

Siga as convenções.

http://www.flickr.com/photos/jasonteale/1340004498/

Sunday, November 6, 11

Page 62: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS

Siga as convenções.

E você será mais feliz =).

http://www.flickr.com/photos/jasonteale/1340004498/

Sunday, November 6, 11

Page 63: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???GENERATORS - HOOKS

Sunday, November 6, 11

Page 64: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS - ORM

https://github.com/mongoid/mongoid

module Rails module Mongoid class Railtie < Rails::Railtie

config.generators.orm :mongoid, :migration => false

end endend

Sunday, November 6, 11

Page 65: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS - TEST FRAMEWORK

https://github.com/rspec/rspec-rails

module Rails module RSpec class Railtie < Rails::Railtie

config.generators.test_framework :rspec

end endend

Sunday, November 6, 11

Page 66: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS - TEMPLATE ENGINE

https://github.com/nex3/haml

module Rails module Haml class Railtie < Rails::Railtie

config.generators.template_engine :haml

end endend

Sunday, November 6, 11

Page 67: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

GENERATORS - MAIS OPÇÕES?

https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/generators.rb

:helper => true,:orm => nil,:integration_tool => nil,:performance_tool => nil,:resource_controller => :controller,:scaffold_controller => :scaffold_controller,:stylesheets => true,:test_framework => nil,:template_engine => :erb

Sunday, November 6, 11

Page 68: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???RAKE TASKS

Sunday, November 6, 11

Page 69: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAKE TASKS

module Rails module RSpec class Railtie < Rails::Railtie

rake_tasks do load "rspec/rails/tasks/rspec.rake" end

end endend

Sunday, November 6, 11

Page 70: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???CONSOLE

Sunday, November 6, 11

Page 71: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

CONSOLE

module ActiveRecord class Railtie < Rails::Railtie

# Forçar o carregamento do # ActiveRecord com o console. console do ActiveRecord::Base end endend

Sunday, November 6, 11

Page 72: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

http://www.flickr.com/photos/mattbrett/224471090/

Sunday, November 6, 11

Page 73: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

module MyGem class Railtie < Rails::Railtie

config.before_configuration { # Roda após criar a classe da Aplicação, mas # antes de rodar as configurações do usuário. }

endend

Sunday, November 6, 11

Page 74: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

module MyGem class Railtie < Rails::Railtie

config.before_initialize { # Roda depois da configuração do usuário, mas # antes dos initializers. }

endend

Sunday, November 6, 11

Page 75: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

module MyGem class Railtie < Rails::Railtie

config.to_prepare { # Roda antes de cada request em development, e # antes da primeira request em production. }

endend

Sunday, November 6, 11

Page 76: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

module MyGem class Railtie < Rails::Railtie

config.before_eager_load { # Roda antes do Rails carregar todo o código # da aplicação. Isso só acontece com a opção # :cache_classes habilitada (production). }

endend

Sunday, November 6, 11

Page 77: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZATION HOOKS

module MyGem class Railtie < Rails::Railtie

config.after_initialize { # Roda após a inicialização do Rails, # configurações do usuário e initializers, e o # próprio bloco to_prepare. É executado apenas # uma única vez, antes da primeira requisição. }

endend

Sunday, November 6, 11

Page 78: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Development

before_configuration=> Booting WEBrickbefore_initializeto_prepareafter_initialize[...] INFO WEBrick 1.3.1

to_prepareRequest...to_prepareRequest...to_prepare

Production (cache_classes)

before_configuration=> Booting WEBrickbefore_initializeto_preparebefore_eager_loadafter_initialize[...] INFO WEBrick 1.3.1

Request...Request...

INITIALIZATION HOOKS

Sunday, November 6, 11

Page 79: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Development

before_configuration=> Booting WEBrickbefore_initializeto_prepareafter_initialize[...] INFO WEBrick 1.3.1

to_prepareRequest...to_prepareRequest...to_prepare

Production (cache_classes)

before_configuration=> Booting WEBrickbefore_initializeto_preparebefore_eager_loadafter_initialize[...] INFO WEBrick 1.3.1

Request...Request...

INITIALIZATION HOOKS

Sunday, November 6, 11

Page 80: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???INITIALIZERS

Sunday, November 6, 11

Page 81: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZERS

module CarrierWave class Railtie < Rails::Railtie

# Initializers “customizados” initializer "carrierwave.setup_paths" do CarrierWave.root = Rails.root.join(Rails.public_path).to_s end

endend

https://github.com/jnicklas/carrierwave

Sunday, November 6, 11

Page 82: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

INITIALIZERS

module MyGem class Railtie < Rails::Railtie

# Temos acesso ao objeto app para # obter as configs do usuário. initializer "my_gem.setup" do |app| # app.config end

endend

Sunday, November 6, 11

Page 83: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???FRAMEWORK LOADING

Sunday, November 6, 11

Page 84: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

FRAMEWORK LOADING

# Cada módulo avisa através do ActiveSupport# quando é carregado.

ActiveSupport.run_load_hooks( :active_record, ActiveRecord::Base)

Sunday, November 6, 11

Page 85: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

FRAMEWORK LOADING

# E podemos executar código neste exato# momento, dentro do contexto do que está# sendo carregado.

ActiveSupport.on_load(:active_record) do include MyGem::ActiveRecordExtensionsend

ActiveSupport.on_load(:action_controller) do include MyGem::ActionControllerExtensionsend

Sunday, November 6, 11

Page 86: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

E O QUE EU FAÇO COM ESSE NEGÓCIO DE

FRAMEWORK LOADING?

Sunday, November 6, 11

Page 87: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

E O QUE EU FAÇO COM ESSE NEGÓCIO DE

FRAMEWORK LOADING?

Sunday, November 6, 11

Page 88: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

FRAMEWORK LOADING + INITIALIZERS

module Devise class Engine < ::Rails::Engine

initializer "devise.url_helpers" do ActiveSupport.on_load(:action_controller) do include Devise::Controllers::Helpers include Devise::Controllers::UrlHelpers end end

endend

https://github.com/plataformatec/devise

Sunday, November 6, 11

Page 89: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

FRAMEWORK LOADING

E você pode criar o seu hook.

ActiveSupport.run_load_hooks(:my_gem, MyGem)

ActiveSupport.on_load(:my_gem) do end

Sunday, November 6, 11

Page 90: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???COMO EU CRIO UMA

RAILS::RAILTIE???

Sunday, November 6, 11

Page 91: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::RAILTIE => COMO?

module MyGem class Railtie < ::Rails::Railtie # Acabamos de criar nossa railtie.

endend

Sunday, November 6, 11

Page 92: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???E QUANDO EU REALMENTE

PRECISO DE UMA RAILS::RAILTIE???

Sunday, November 6, 11

Page 93: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::RAILTIE => QUANDO?

• Precisar carregar generators em outro diretório;

• Precisar de rake tasks disponíveis na aplicação;• Precisar executar código ao carregar o console;

• Precisar rodar código no momento de inicialização de seu plugin/gem, como um initializer do Rails;

• Precisar extender as funcionalidades de algum dos frameworks;

Sunday, November 6, 11

Page 94: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

EXEMPLO REAL???

Sunday, November 6, 11

Page 95: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

module Responders class Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new config.generators.scaffold_controller = :responders_controller

# Add load paths straight to I18n, so engines and application can overwrite it require 'active_support/i18n' I18n.load_path << File.expand_path('../responders/locales/en.yml', __FILE__)

initializer "responders.flash_responder" do |app| if app.config.responders.flash_keys Responders::FlashResponder.flash_keys = app.config.responders.flash_keys end end endend

https://github.com/plataformatec/responders

Sunday, November 6, 11

Page 96: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

Rails::EngineWTF???

Rails::Railtie + Paths + Autoload

Sunday, November 6, 11

Page 97: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

app/controllersapp/helpersapp/mailersapp/modelsapp/viewsconfig/initializers/*.rbconfig/routes.rbconfig/locales/*.{rb,yml}liblib/tasks/*.rake

RAILS::ENGINE

Sunday, November 6, 11

Page 98: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Carrega automaticamente controllers, helpers, models, mailers e views dentro do

diretório app/.

O arquivo de rotas, initializers e locales são detectados e carregados quando em config/, seguindo a mesma estrutura da aplicação.

RAILS::ENGINE

Sunday, November 6, 11

Page 99: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

O diretório lib é adicionado ao autoload_path do Rails.

Os arquivos lib/tasks/*.rake são automaticamente carregados, basta

seguir esta convenção.

RAILS::ENGINE

Sunday, November 6, 11

Page 100: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

O que não é carregado automaticamente pela Engine:

migrations e assets na pasta public (javascripts, stylesheets, etc).

RAILS::ENGINE

Sunday, November 6, 11

Page 101: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::ENGINE

module MyGem class Engine < ::Rails::Engine

# Você pode alterar os load_paths padrão. paths.app.controllers << "lib/controllers"

endend

Sunday, November 6, 11

Page 102: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???COMO EU CRIO UMA

RAILS::ENGINE???

Sunday, November 6, 11

Page 103: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::ENGINE => COMO?

module MyGem class Engine < ::Rails::Engine # Acabamos de criar nossa engine.

endend

Sunday, November 6, 11

Page 104: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???E QUANDO EU PRECISO DE UMA

RAILS::ENGINE???

Sunday, November 6, 11

Page 105: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::ENGINE => QUANDO?

• Suas extensões precisarem de: rotas, controllers, views ou mailers, por exemplo.

Sunday, November 6, 11

Page 106: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

EXEMPLO REAL???

Sunday, November 6, 11

Page 107: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

module Devise class Engine < ::Rails::Engine config.devise = Devise

# Initialize Warden and copy its configurations. config.app_middleware.use Warden::Manager do |config| Devise.warden_config = config end

# Force routes to be loaded if we are doing any eager load. config.before_eager_load { |app| app.reload_routes! }

initializer "devise.url_helpers" do Devise.include_helpers(Devise::Controllers) end

initializer "devise.omniauth" do |app| Devise.omniauth_configs.each do |provider, config| app.middleware.use config.strategy_class, *config.args do |strategy| config.strategy = strategy end end

if Devise.omniauth_configs.any? Devise.include_helpers(Devise::OmniAuth) end end endend

https://github.com/plataformatec/devise

Sunday, November 6, 11

Page 108: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

Rails::PluginWTF???

Rails::Engine + interno ao Rails

Sunday, November 6, 11

Page 109: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Engine com alguns conhecimentos extras para carregar os plugins.

RAILS::PLUGIN

Sunday, November 6, 11

Page 110: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Engine com alguns conhecimentos extras para carregar os plugins.

E você ganha de brinde a habilidade do Rails de carregar o arquivo

“init.rb” no diretório root do plugin.

RAILS::PLUGIN

Sunday, November 6, 11

Page 111: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::PLUGIN

Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin.

Sunday, November 6, 11

Page 112: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::PLUGIN

Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin.

Isto quer dizer que não é possível colocar uma Engine dentro de vendor/plugins, porque

os arquivos seriam carregados duas vezes.

Sunday, November 6, 11

Page 113: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???COMO EU CRIO UM

RAILS::PLUGIN???

Sunday, November 6, 11

Page 114: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::PLUGIN => COMO?

rails plugin installrails server

Sunday, November 6, 11

Page 115: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???E QUANDO EU PRECISO DE UM

RAILS::PLUGIN???

Sunday, November 6, 11

Page 116: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::PLUGIN => QUANDO?

Nunca. Lembre-se: é interno ao Rails.

Sunday, November 6, 11

Page 117: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

Rails::ApplicationWTF???

Rails::Engine + App Bootstrap

Sunday, November 6, 11

Page 118: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.

RAILS::APPLICATION

Sunday, November 6, 11

Page 119: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.

Inicializa railties, engines e plugins.

RAILS::APPLICATION

Sunday, November 6, 11

Page 120: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Possui as configurações relativas a aplicação, como o “cache_classes”.

RAILS::APPLICATION

Sunday, November 6, 11

Page 121: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Possui as configurações relativas a aplicação, como o “cache_classes”.

Carrega e recarrega as rotas quando necessário, e constrói a estrutura de

middlewares da aplicação.

RAILS::APPLICATION

Sunday, November 6, 11

Page 122: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Highlander!

RAILS::APPLICATION

Sunday, November 6, 11

Page 123: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

Highlander!

RAILS::APPLICATION

raise "You cannot have more than one Rails::Application" if Rails.application

https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/application.rb

Sunday, November 6, 11

Page 124: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???COMO EU CRIO UMA RAILS::APPLICATION???

Sunday, November 6, 11

Page 125: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

WTF???

RAILS::APPLICATION => COMO?

rails new my_appcd my_apprails server

Sunday, November 6, 11

Page 126: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESUMO

Sunday, November 6, 11

Page 127: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Sunday, November 6, 11

Page 128: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Não é uma Rails::Application.

Sunday, November 6, 11

Page 129: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Não é uma Rails::Application.Não é um Rails::Plugin.

Sunday, November 6, 11

Page 130: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Sunday, November 6, 11

Page 131: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Não é uma Rails::Engine.

Sunday, November 6, 11

Page 132: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Não é uma Rails::Engine.Não é uma Rails::Railtie.

Sunday, November 6, 11

Page 133: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

SIMPLE_FORM

Nenhum hook é necessário, podemos apenas utilizar a

estratégia de framework loading sem precisar de uma Rails::Railtie.

Sunday, November 6, 11

Page 134: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Sunday, November 6, 11

Page 135: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Não é uma Rails::Application.

Sunday, November 6, 11

Page 136: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Não é uma Rails::Application.Não é um Rails::Plugin.

Sunday, November 6, 11

Page 137: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Sunday, November 6, 11

Page 138: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Não é uma Rails::Engine.

Sunday, November 6, 11

Page 139: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Não é uma Rails::Application.Não é um Rails::Plugin.

(a não ser que seja instalado como tal)

Não é uma Rails::Engine.É uma Rails::Railtie.

Sunday, November 6, 11

Page 140: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RESPONDERS

Permite configuração através do objeto :config;Utiliza alguns hooks de inicialização;

Sobrescreve o :scaffold_generator para utilizar o seu próprio.

Sunday, November 6, 11

Page 141: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Sunday, November 6, 11

Page 142: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Não é uma Rails::Application.

Sunday, November 6, 11

Page 143: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Não é uma Rails::Application.Não é um Rails::Plugin.

Sunday, November 6, 11

Page 144: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Não é uma Rails::Application.Não é um Rails::Plugin.

(e NÃO DEVE ser instalado como tal)

Sunday, November 6, 11

Page 145: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Não é uma Rails::Application.Não é um Rails::Plugin.

(e NÃO DEVE ser instalado como tal)

É uma Rails::Engine e por consequência uma Rails::Railtie.

Sunday, November 6, 11

Page 146: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

DEVISE

Permite configuração através do objeto :config;Utiliza alguns hooks de inicialização;

Adiciona middlewares;Possui funções similares a uma aplicação, com

controllers, helpers, mailers, views e rotas, mas não é capaz de rodar isoladamente.

Sunday, November 6, 11

Page 147: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

CRIANDO UMA GEM

Sunday, November 6, 11

Page 148: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLER

Sunday, November 6, 11

Page 149: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLER

bundle gem ruby_masters

Sunday, November 6, 11

Page 150: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

Cria a estrutura de diretórios basica da gem.

Cria um arquivo Rakefile carregando tarefas do próprio Bundler.

Inicializa um repositório git.

Sunday, November 6, 11

Page 151: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

~/Projects [ree-1.8.7@rubymasters] $ bundle gem ruby_masters create ruby_masters/Gemfile create ruby_masters/Rakefile create ruby_masters/.gitignore create ruby_masters/ruby_masters.gemspec create ruby_masters/lib/ruby_masters.rb create ruby_masters/lib/ruby_masters/version.rbInitializating git repo in ~/Projects/ruby_masters

Sunday, November 6, 11

Page 152: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

Gemfile

source "http://rubygems.org"

# Specify your gem's dependencies in ruby_masters.gemspecgemspec

Sunday, November 6, 11

Page 153: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

Rakefile

require 'bundler'Bundler::GemHelper.install_tasks

Sunday, November 6, 11

Page 154: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

# -*- encoding: utf-8 -*-$:.push File.expand_path("../lib", __FILE__)require "ruby_masters/version"

Gem::Specification.new do |s| s.name = "ruby_masters" s.version = RubyMasters::VERSION s.platform = Gem::Platform::RUBY s.authors = ["TODO: Write your name"] s.email = ["TODO: Write your email address"] s.homepage = "" s.summary = %q{TODO: Write a gem summary} s.description = %q{TODO: Write a gem description}

s.rubyforge_project = "ruby_masters" # ... continuaend

ruby_masters.gemspec

Sunday, November 6, 11

Page 155: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

lib/ruby_masters.rb

module RubyMasters # Your code goes here...end

Sunday, November 6, 11

Page 156: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

lib/ruby_masters/version.rb

module RubyMasters VERSION = "0.0.1"end

Sunday, November 6, 11

Page 157: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM

rake tasks

~/Projects/ruby_masters [ree-1.8.7@rubymasters] $ rake -Trake build # Build ruby_masters-0.0.1.gem into the pkg directoryrake install # Build and install ruby_masters-0.0.1.gem into system gemsrake release # Create tag v0.0.1 and build and push ruby_masters-0.0.1.gem to Rubygems

Sunday, November 6, 11

Page 158: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILTIE?

Sunday, November 6, 11

Page 159: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM + RAILTIE

lib/ruby_masters.rb

module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = ActiveSupport::OrderedOptions.new # rake_tasks {} # generators {} # console {} # config.to_prepare {} # initializer {} endend

Sunday, November 6, 11

Page 160: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM + RAILTIE

Ou

Sunday, November 6, 11

Page 161: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLE GEM + RAILTIE

lib/ruby_masters/railtie.rb

module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = ActiveSupport::OrderedOptions.new # rake_tasks {} # generators {} # console {} # config.to_prepare {} # initializer {} endend

lib/ruby_masters.rb

require "ruby_masters/railtie"

module RubyMasters # Your code goes here...end

Sunday, November 6, 11

Page 162: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

BUNDLER <3

Sunday, November 6, 11

Page 163: railties @ ruby mastersconf - 2011.02.26

Carlos Antonio @cantoniodasilvablog.plataformatec.com.br

RAILS 3

Sunday, November 6, 11

Page 164: railties @ ruby mastersconf - 2011.02.26

@cantoniodasilva

blog.plataformatec.com.br

Obrigado!

?!

Sunday, November 6, 11