Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
RAILTIES                          OU      COMO DESENVOLVER    PLUGINS/GEMS PARA RAILSCarlos Antonio   blog.plataformatec.c...
$ WHOAMICarlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
CARLOS ANTONIO DA SILVA                 @cantoniodasilvaCarlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
COMECEI COM DESENVOLVIMENTO EM 2003 E COM RUBY E RAILS EM 2007Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
TRABALHO NACarlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
DEVISECarlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
SIMPLE_FORMCarlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
RESPONDERSCarlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
THE ROAD SO FAR                     RAILS 2.3Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
RAILS 2.3            Já possuía a estrutura de Rails Engine.Carlos Antonio          blog.plataformatec.com.br   @cantoniod...
RAILS 2.3            Já possuía a estrutura de Rails Engine.                               Mas...Carlos Antonio          b...
RAILS 2.3            Já possuía a estrutura de Rails Engine.                      Mas...    podemos dizer que era uma boa ...
RAILS 2.3  http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpgCarlos Antonio    ...
RAILS 2.3                     module Rails                       class Plugin                         # Engines are plugin...
RAILS 2.3Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.Carlos Antonio   blog...
RAILS 2.3Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.     Mas eram fixos, n...
RAILS 2.3        module Rails          class Plugin            def view_path              File.join(directory, app, views)...
RAILS 2.3  Tínhamos ORMs diferentes “integradas” ao Rails,     como o Datamapper e o MongoMapper...Carlos Antonio     blog...
RAILS 2.3  Tínhamos ORMs diferentes “integradas” ao Rails,     como o Datamapper e o MongoMapper...Que poderiam quebrar a ...
RAILS 2.3 Não existia uma API pública definida para outros            frameworks se integrarem.Carlos Antonio    blog.plata...
RAILS 2.3 Não existia uma API pública definida para outros            frameworks se integrarem.    A solução: alias method ...
RAILS 2.3http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpgCarlos Antonio ...
RAILS 2.3     O Rails sabia da existência do ActiveRecord...Carlos Antonio       blog.plataformatec.com.br   @cantoniodasi...
RAILS 2.3     O Rails sabia da existência do ActiveRecord...        Pois era ele o responsável por inicializar o         A...
RAILS 2.3  Isso quer dizer que, por mais que você estivesse  utilizando o DataMapper ou MongoMapper, por     exemplo, o Ac...
RAILS 2.3module Rails  class Initializer    # Requires all frameworks specified by the Configuration#frameworks    # list....
RAILS 2.3module Rails  class Configuration    private        def default_frameworks          [ :active_record, :action_con...
RAILS 2.3                     SINGLE                 RESPONSIBILITY                   PRINCIPLECarlos Antonio      blog.pl...
RAILS 2.3                     SINGLE                 RESPONSIBILITY                   PRINCIPLECarlos Antonio      blog.pl...
RAILS 2.3Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
NOW                 RAILS 3Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
RAILS 3                       Modularidade.                 API pública e bem definida.Carlos Antonio         blog.platafor...
RAILS 3                                                         HOOKS!                 http://www.flickr.com/photos/ooh_foo...
RAILS 3            O Rails não conhece o ActiveRecord.Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
RAILS 3            O Rails não conhece o ActiveRecord.O ActiveRecord é quem conta para o Rails como           ele deve ser...
RAILS 3E isso acontece com todos os outros frameworks.Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
RAILS 3      ActiveRecord                               ActionViewE isso acontece com todos os outros frameworks. ActiveRe...
RAILS 3E isso acontece com todas as demais gems/plugins           que se integram com o Rails.Carlos Antonio   blog.plataf...
RAILS 3      DataMapper                               MongoidE isso acontece com todas as demais gems/plugins           qu...
EXEMPLO REAL???Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
module ActiveRecord              class Railtie < Rails::Railtie                config.active_record = ActiveSupport::Order...
RAILS 3                     SINGLE                 RESPONSIBILITY                   PRINCIPLECarlos Antonio      blog.plat...
RAILS 3                                                 WIN!!!                 http://www.flickr.com/photos/simoncopping/50...
Railties?    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Railties?                                 WTF???    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Railties?    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Railties                    Engine?    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Application     Railties                    Engine?    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Initialization     Application     Railties                    Engine?    Carlos Antonio   blog.plataformatec.com.br   @ca...
Initialization     Application     Railties                    Engine?                       Generators    Carlos Antonio ...
Initialization?   HOOKS     Application     Railties                    Engine                       Generators    Carlos ...
CONFIGURAÇÃO?    Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
CONFIGURAÇÃO    module Responders      class Railtie < ::Rails::Railtie          config.responders = ActiveSupport::Ordere...
GENERATORS?    Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
GENERATORS                     module MyGem                       class Railtie < ::Rails::Railtie                        ...
GENERATORS               Preciso realmente adicionar na Railtie??    Carlos Antonio         blog.plataformatec.com.br   @c...
GENERATORS               Preciso realmente adicionar na Railtie??                    Não, se você seguir a convenção.    C...
GENERATORS                       simple_form                         lib                           generators             ...
GENERATORS                       simple_form                         lib                       Namespace                  ...
GENERATORS       module SimpleForm         module Generators           class InstallGenerator < Rails::Generators::Base   ...
GENERATORS                                               Siga as convenções.?                     http://www.flickr.com/pho...
GENERATORS                                               Siga as convenções.?                                         E vo...
GENERATORS - HOOKS?    Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
GENERATORS - ORM    module Rails      module Mongoid        class Railtie < Rails::Railtie             config.generators.o...
GENERATORS - TEST FRAMEWORK    module Rails      module RSpec        class Railtie < Rails::Railtie             config.gen...
GENERATORS - TEMPLATE ENGINE    module Rails      module Haml        class Railtie < Rails::Railtie             config.gen...
GENERATORS - MAIS OPÇÕES?            :helper                                =>    true,            :orm                   ...
RAKE TASKS?    Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
RAKE TASKS             module Rails               module RSpec                 class Railtie < Rails::Railtie             ...
CONSOLE?    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
CONSOLE              module ActiveRecord                class Railtie < Rails::Railtie                     # Forçar o carr...
INITIALIZATION HOOKS?                     http://www.flickr.com/photos/mattbrett/224471090/    Carlos Antonio              ...
INITIALIZATION HOOKS       module MyGem         class Railtie < Rails::Railtie             config.before_configuration {  ...
INITIALIZATION HOOKS       module MyGem         class Railtie < Rails::Railtie             config.before_initialize {     ...
INITIALIZATION HOOKS       module MyGem         class Railtie < Rails::Railtie             config.to_prepare {            ...
INITIALIZATION HOOKS       module MyGem         class Railtie < Rails::Railtie             config.before_eager_load {     ...
INITIALIZATION HOOKS       module MyGem         class Railtie < Rails::Railtie             config.after_initialize {      ...
INITIALIZATION HOOKS            Development                             Production (cache_classes)            before_config...
INITIALIZATION HOOKS            Development                             Production (cache_classes)            before_config...
INITIALIZERS?    Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
INITIALIZERS       module CarrierWave         class Railtie < Rails::Railtie             # Initializers “customizados”    ...
INITIALIZERS                     module MyGem                       class Railtie < Rails::Railtie                        ...
FRAMEWORK LOADING?    Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
FRAMEWORK LOADING            # Cada módulo avisa através do ActiveSupport            # quando é carregado.?               ...
FRAMEWORK LOADING            # E podemos executar código neste exato            # momento, dentro do contexto do que está ...
E O QUE EU FAÇO COM           ESSE NEGÓCIO DE        FRAMEWORK LOADING?Carlos Antonio   blog.plataformatec.com.br   @canto...
E O QUE EU FAÇO COM           ESSE NEGÓCIO DE        FRAMEWORK LOADING?Carlos Antonio   blog.plataformatec.com.br   @canto...
FRAMEWORK LOADING +                   INITIALIZERS       module Devise         class Engine < ::Rails::Engine             ...
FRAMEWORK LOADING                     E você pode criar o seu hook.?           ActiveSupport.run_load_hooks(:my_gem, MyGem...
COMO EU CRIO UMA                       RAILS::RAILTIE????    Carlos Antonio        blog.plataformatec.com.br   @cantonioda...
RAILS::RAILTIE => COMO?                 module MyGem                   class Railtie < ::Rails::Railtie                   ...
E QUANDO EU REALMENTE    PRECISO DE UMA RAILS::RAILTIE????    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
RAILS::RAILTIE => QUANDO?       • Precisar carregar generators em outro diretório;       • Precisar de rake tasks disponív...
EXEMPLO REAL???Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
module Responders      class Railtie < ::Rails::Railtie        config.responders = ActiveSupport::OrderedOptions.new      ...
Rails::Engine?                     Rails::Railtie + Paths + Autoload    Carlos Antonio           blog.plataformatec.com.br...
RAILS::ENGINE                      app/controllers                      app/helpers                      app/mailers      ...
RAILS::ENGINE             Carrega automaticamente controllers,           helpers, models, mailers e views dentro do       ...
RAILS::ENGINE                      O diretório lib é adicionado ao                         autoload_path do Rails.?       ...
RAILS::ENGINE                           O que não é carregado                       automaticamente pela Engine:          ...
RAILS::ENGINE            module MyGem              class Engine < ::Rails::Engine                     # Você pode alterar ...
COMO EU CRIO UMA                       RAILS::ENGINE????    Carlos Antonio        blog.plataformatec.com.br   @cantoniodas...
RAILS::ENGINE => COMO?                     module MyGem                       class Engine < ::Rails::Engine              ...
E QUANDO EU PRECISO DE UMA          RAILS::ENGINE????    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
RAILS::ENGINE => QUANDO?       • Suas extensões precisarem de: rotas, controllers, views ou       mailers, por exemplo.?  ...
EXEMPLO REAL???Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
module Devise      class Engine < ::Rails::Engine        config.devise = Devise        # Initialize Warden and copy its co...
Rails::Plugin?                     Rails::Engine + interno ao Rails    Carlos Antonio           blog.plataformatec.com.br ...
RAILS::PLUGIN                     Engine com alguns conhecimentos                      extras para carregar os plugins.?  ...
RAILS::PLUGIN                     Engine com alguns conhecimentos                      extras para carregar os plugins.?  ...
RAILS::PLUGIN          Cada plugin em vendor/plugins é carregado               pelo Rails como um Rails::Plugin.?    Carlo...
RAILS::PLUGIN          Cada plugin em vendor/plugins é carregado               pelo Rails como um Rails::Plugin.?        I...
COMO EU CRIO UM                      RAILS::PLUGIN????    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
RAILS::PLUGIN => COMO?                     rails plugin install                         rails server?    Carlos Antonio   ...
E QUANDO EU PRECISO DE UM            RAILS::PLUGIN????    Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
RAILS::PLUGIN => QUANDO?                Nunca. Lembre-se: é interno ao Rails.?    Carlos Antonio          blog.plataformat...
Rails::Application?                      Rails::Engine + App Bootstrap    Carlos Antonio           blog.plataformatec.com....
RAILS::APPLICATION                       Engine com super powers e a                     responsabilidade de coordenar o  ...
RAILS::APPLICATION                       Engine com super powers e a                     responsabilidade de coordenar o  ...
RAILS::APPLICATION                     Possui as configurações relativas a                     aplicação, como o “cache_cla...
RAILS::APPLICATION                     Possui as configurações relativas a                     aplicação, como o “cache_cla...
RAILS::APPLICATION                           Highlander!?    Carlos Antonio        blog.plataformatec.com.br   @cantonioda...
RAILS::APPLICATION                                           Highlander!?     raise "You cannot have more than one Rails::...
COMO EU CRIO UMA                     RAILS::APPLICATION????    Carlos Antonio         blog.plataformatec.com.br   @cantoni...
RAILS::APPLICATION => COMO?                     rails new my_app                         cd my_app                        ...
RESUMOCarlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
SIMPLE_FORMCarlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
SIMPLE_FORM                 Não é uma Rails::Application.Carlos Antonio           blog.plataformatec.com.br   @cantoniodas...
SIMPLE_FORM                 Não é uma Rails::Application.                   Não é um Rails::Plugin.Carlos Antonio         ...
SIMPLE_FORM                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a...
SIMPLE_FORM                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a...
SIMPLE_FORM                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a...
SIMPLE_FORM                    Nenhum hook é necessário,                     podemos apenas utilizar a                  es...
RESPONDERSCarlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
RESPONDERS                 Não é uma Rails::Application.Carlos Antonio           blog.plataformatec.com.br   @cantoniodasi...
RESPONDERS                 Não é uma Rails::Application.                   Não é um Rails::Plugin.Carlos Antonio          ...
RESPONDERS                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a ...
RESPONDERS                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a ...
RESPONDERS                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (a ...
RESPONDERS  Permite configuração através do objeto :config;        Utiliza alguns hooks de inicialização;  Sobrescreve o :sc...
DEVISECarlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
DEVISE                 Não é uma Rails::Application.Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
DEVISE                 Não é uma Rails::Application.                   Não é um Rails::Plugin.Carlos Antonio           blo...
DEVISE                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                     (e NÃO ...
DEVISE                 Não é uma Rails::Application.                   Não é um Rails::Plugin.                       (e NÃ...
DEVISE Permite configuração através do objeto :config;        Utiliza alguns hooks de inicialização;               Adiciona ...
CRIANDO UMA GEMCarlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
BUNDLERCarlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
BUNDLER                 bundle gem ruby_mastersCarlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
BUNDLE GEM     Cria a estrutura de diretórios basica da gem.   Cria um arquivo Rakefile carregando tarefas do              ...
BUNDLE GEM           ~/Projects [ree-1.8.7@rubymasters] $ bundle gem ruby_masters                 create ruby_masters/Gemf...
BUNDLE GEM                                  Gemfile                 source "http://rubygems.org"                 # Specify ...
BUNDLE GEM                                  Rakefile                 require bundler                 Bundler::GemHelper.ins...
BUNDLE GEM                     ruby_masters.gemspec                 # -*- encoding: utf-8 -*-                 $:.push File...
BUNDLE GEM                        lib/ruby_masters.rb                 module RubyMasters                   # Your code goe...
BUNDLE GEM                 lib/ruby_masters/version.rb                 module RubyMasters                   VERSION = "0.0...
BUNDLE GEM                                  rake tasks~/Projects/ruby_masters [ree-1.8.7@rubymasters] $ rake -Trake build ...
RAILTIE?Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
BUNDLE GEM + RAILTIE                              lib/ruby_masters.rb                 module RubyMasters                  ...
BUNDLE GEM + RAILTIE                                OuCarlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
BUNDLE GEM + RAILTIE lib/ruby_masters.rb                       lib/ruby_masters/railtie.rb                                ...
BUNDLER <3Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
RAILS 3Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
@cantoniodasilva?!       blog.plataformatec.com.br     Obrigado            !
Upcoming SlideShare
Loading in …5
×

Railties - Ruby Masters Conf - 26Feb2011

3,858 views

Published on

Carlos Antônio fala sobre a estrutura das Railties do Rails 3.

Published in: Technology
  • Be the first to comment

Railties - Ruby Masters Conf - 26Feb2011

  1. 1. RAILTIES OU COMO DESENVOLVER PLUGINS/GEMS PARA RAILSCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  2. 2. $ WHOAMICarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  3. 3. CARLOS ANTONIO DA SILVA @cantoniodasilvaCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  4. 4. COMECEI COM DESENVOLVIMENTO EM 2003 E COM RUBY E RAILS EM 2007Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  5. 5. TRABALHO NACarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  6. 6. DEVISECarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  7. 7. SIMPLE_FORMCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  8. 8. RESPONDERSCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  9. 9. THE ROAD SO FAR RAILS 2.3Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  10. 10. RAILS 2.3 Já possuía a estrutura de Rails Engine.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  11. 11. RAILS 2.3 Já possuía a estrutura de Rails Engine. Mas...Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  12. 12. RAILS 2.3 Já possuía a estrutura de Rails Engine. Mas... podemos dizer que era uma boa “gambiarra”.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  13. 13. RAILS 2.3 http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpgCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  14. 14. 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 end end https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rbCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  15. 15. RAILS 2.3Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  16. 16. RAILS 2.3Diretó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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  17. 17. RAILS 2.3 module 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 end end https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rbCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  18. 18. RAILS 2.3 Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper...Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  19. 19. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  20. 20. RAILS 2.3 Não existia uma API pública definida para outros frameworks se integrarem.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  21. 21. RAILS 2.3 Não existia uma API pública definida para outros frameworks se integrarem. A solução: alias method chain / monkey patch.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  22. 22. RAILS 2.3http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpgCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  23. 23. RAILS 2.3 O Rails sabia da existência do ActiveRecord...Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  24. 24. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  25. 25. RAILS 2.3 Isso quer dizer que, por mais que você estivesse utilizando o DataMapper ou MongoMapper, por exemplo, o ActiveRecord sempre estaria lá.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  26. 26. 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 endendCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  27. 27. RAILS 2.3module Rails class Configuration private def default_frameworks [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] end endendCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  28. 28. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLECarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  29. 29. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLECarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  30. 30. RAILS 2.3Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  31. 31. NOW RAILS 3Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  32. 32. RAILS 3 Modularidade. API pública e bem definida.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  33. 33. RAILS 3 HOOKS! http://www.flickr.com/photos/ooh_food/3304708302/Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  34. 34. RAILS 3 O Rails não conhece o ActiveRecord.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  35. 35. RAILS 3 O Rails não conhece o ActiveRecord.O ActiveRecord é quem conta para o Rails como ele deve ser inicializado.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  36. 36. RAILS 3E isso acontece com todos os outros frameworks.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  37. 37. RAILS 3 ActiveRecord ActionViewE isso acontece com todos os outros frameworks. ActiveResource ActionController ActionMailerCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  38. 38. RAILS 3E isso acontece com todas as demais gems/plugins que se integram com o Rails.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  39. 39. RAILS 3 DataMapper MongoidE isso acontece com todas as demais gems/plugins que se integram com o Rails. outros... RSpec DeviseCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  40. 40. EXEMPLO REAL???Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  41. 41. 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 end end https://github.com/rails/rails/tree/3-0-stable/activerecord Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  42. 42. RAILS 3 SINGLE RESPONSIBILITY PRINCIPLECarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  43. 43. RAILS 3 WIN!!! http://www.flickr.com/photos/simoncopping/5050597808/Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  44. 44. Railties? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  45. 45. Railties? WTF??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  46. 46. Railties? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  47. 47. Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  48. 48. Application Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  49. 49. Initialization Application Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  50. 50. Initialization Application Railties Engine? Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  51. 51. Initialization? HOOKS Application Railties Engine Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  52. 52. CONFIGURAÇÃO? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  53. 53. CONFIGURAÇÃO module Responders class Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new # Na configuração da app (application.rb):? # config.responders.flash_keys = [:notice, :failure] end end https://github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  54. 54. GENERATORS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  55. 55. GENERATORS module MyGem class Railtie < ::Rails::Railtie generators do require "my_gem/generator" end? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  56. 56. GENERATORS Preciso realmente adicionar na Railtie?? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  57. 57. GENERATORS Preciso realmente adicionar na Railtie?? Não, se você seguir a convenção. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  58. 58. GENERATORS simple_form lib generators simple_form install_generator.rb templates? simple_form.rb rails generate simple_form:install https://github.com/plataformatec/simple_form Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  59. 59. GENERATORS simple_form lib Namespace generators simple_form install_generator.rb Generator templates? simple_form.rb rails generate simple_form:install https://github.com/plataformatec/simple_form Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  60. 60. GENERATORS 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 end end rails generate simple_form:install http://guides.rubyonrails.org/generators.html Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  61. 61. GENERATORS Siga as convenções.? http://www.flickr.com/photos/jasonteale/1340004498/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  62. 62. GENERATORS Siga as convenções.? E você será mais feliz =). http://www.flickr.com/photos/jasonteale/1340004498/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  63. 63. GENERATORS - HOOKS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  64. 64. GENERATORS - ORM module Rails module Mongoid class Railtie < Rails::Railtie config.generators.orm :mongoid, :migration => false? end end end https://github.com/mongoid/mongoid Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  65. 65. GENERATORS - TEST FRAMEWORK module Rails module RSpec class Railtie < Rails::Railtie config.generators.test_framework :rspec? end end end https://github.com/rspec/rspec-rails Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  66. 66. GENERATORS - TEMPLATE ENGINE module Rails module Haml class Railtie < Rails::Railtie config.generators.template_engine :haml? end end end https://github.com/nex3/haml Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  67. 67. GENERATORS - MAIS OPÇÕES? :helper => true, :orm => nil, :integration_tool => nil, :performance_tool => nil, :resource_controller => :controller, :scaffold_controller => :scaffold_controller,? :stylesheets :test_framework :template_engine => => => true, nil, :erb https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/generators.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  68. 68. RAKE TASKS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  69. 69. RAKE TASKS module Rails module RSpec class Railtie < Rails::Railtie rake_tasks do load "rspec/rails/tasks/rspec.rake" end? end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  70. 70. CONSOLE? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  71. 71. CONSOLE module ActiveRecord class Railtie < Rails::Railtie # Forçar o carregamento do # ActiveRecord com o console. console do ActiveRecord::Base? end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  72. 72. INITIALIZATION HOOKS? http://www.flickr.com/photos/mattbrett/224471090/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  73. 73. 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. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  74. 74. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.before_initialize { # Roda depois da configuração do usuário, mas? # antes dos initializers. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  75. 75. 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. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  76. 76. 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). end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  77. 77. 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. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  78. 78. INITIALIZATION HOOKS Development Production (cache_classes) before_configuration before_configuration => Booting WEBrick => Booting WEBrick before_initialize before_initialize to_prepare to_prepare? after_initialize before_eager_load [...] INFO WEBrick 1.3.1 after_initialize [...] INFO WEBrick 1.3.1 to_prepare Request... Request... to_prepare Request... Request... to_prepare Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  79. 79. INITIALIZATION HOOKS Development Production (cache_classes) before_configuration before_configuration => Booting WEBrick => Booting WEBrick before_initialize before_initialize to_prepare to_prepare? after_initialize before_eager_load [...] INFO WEBrick 1.3.1 after_initialize [...] INFO WEBrick 1.3.1 to_prepare Request... Request... to_prepare Request... Request... to_prepare Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  80. 80. INITIALIZERS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  81. 81. INITIALIZERS module CarrierWave class Railtie < Rails::Railtie # Initializers “customizados” initializer "carrierwave.setup_paths" do CarrierWave.root =? end Rails.root.join(Rails.public_path).to_s end end https://github.com/jnicklas/carrierwave Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  82. 82. 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 end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  83. 83. FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  84. 84. FRAMEWORK LOADING # Cada módulo avisa através do ActiveSupport # quando é carregado.? ActiveSupport.run_load_hooks( :active_record, ActiveRecord::Base) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  85. 85. 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::ActiveRecordExtensions end? ActiveSupport.on_load(:action_controller) do include MyGem::ActionControllerExtensions end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  86. 86. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING?Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  87. 87. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING?Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  88. 88. 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 end end https://github.com/plataformatec/devise Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  89. 89. FRAMEWORK LOADING E você pode criar o seu hook.? ActiveSupport.run_load_hooks(:my_gem, MyGem) ActiveSupport.on_load(:my_gem) do end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  90. 90. COMO EU CRIO UMA RAILS::RAILTIE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  91. 91. RAILS::RAILTIE => COMO? module MyGem class Railtie < ::Rails::Railtie # Acabamos de criar nossa railtie.? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  92. 92. E QUANDO EU REALMENTE PRECISO DE UMA RAILS::RAILTIE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  93. 93. 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; Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  94. 94. EXEMPLO REAL???Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  95. 95. 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 end end https://github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  96. 96. Rails::Engine? Rails::Railtie + Paths + Autoload Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  97. 97. RAILS::ENGINE app/controllers app/helpers app/mailers app/models app/views config/initializers/*.rb config/routes.rb? config/locales/*.{rb,yml} lib lib/tasks/*.rake Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  98. 98. RAILS::ENGINE 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  99. 99. RAILS::ENGINE O diretório lib é adicionado ao autoload_path do Rails.? Os arquivos lib/tasks/*.rake são automaticamente carregados, basta seguir esta convenção. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  100. 100. RAILS::ENGINE O que não é carregado automaticamente pela Engine: migrations e assets na pasta public? (javascripts, stylesheets, etc). Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  101. 101. RAILS::ENGINE module MyGem class Engine < ::Rails::Engine # Você pode alterar os load_paths padrão. paths.app.controllers << "lib/controllers"? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  102. 102. COMO EU CRIO UMA RAILS::ENGINE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  103. 103. RAILS::ENGINE => COMO? module MyGem class Engine < ::Rails::Engine # Acabamos de criar nossa engine.? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  104. 104. E QUANDO EU PRECISO DE UMA RAILS::ENGINE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  105. 105. RAILS::ENGINE => QUANDO? • Suas extensões precisarem de: rotas, controllers, views ou mailers, por exemplo.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  106. 106. EXEMPLO REAL???Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  107. 107. 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 end end https://github.com/plataformatec/devise Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  108. 108. Rails::Plugin? Rails::Engine + interno ao Rails Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  109. 109. RAILS::PLUGIN Engine com alguns conhecimentos extras para carregar os plugins.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  110. 110. RAILS::PLUGIN 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  111. 111. RAILS::PLUGIN Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  112. 112. 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  113. 113. COMO EU CRIO UM RAILS::PLUGIN???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  114. 114. RAILS::PLUGIN => COMO? rails plugin install rails server? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  115. 115. E QUANDO EU PRECISO DE UM RAILS::PLUGIN???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  116. 116. RAILS::PLUGIN => QUANDO? Nunca. Lembre-se: é interno ao Rails.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  117. 117. Rails::Application? Rails::Engine + App Bootstrap Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  118. 118. RAILS::APPLICATION Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  119. 119. RAILS::APPLICATION Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.? Inicializa railties, engines e plugins. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  120. 120. RAILS::APPLICATION Possui as configurações relativas a aplicação, como o “cache_classes”.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  121. 121. RAILS::APPLICATION 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  122. 122. RAILS::APPLICATION Highlander!? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  123. 123. RAILS::APPLICATION Highlander!? 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 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  124. 124. COMO EU CRIO UMA RAILS::APPLICATION???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  125. 125. RAILS::APPLICATION => COMO? rails new my_app cd my_app rails server? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  126. 126. RESUMOCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  127. 127. SIMPLE_FORMCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  128. 128. SIMPLE_FORM Não é uma Rails::Application.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  129. 129. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  130. 130. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal)Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  131. 131. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  132. 132. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  133. 133. SIMPLE_FORM Nenhum hook é necessário, podemos apenas utilizar a estratégia de framework loading sem precisar de uma Rails::Railtie.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  134. 134. RESPONDERSCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  135. 135. RESPONDERS Não é uma Rails::Application.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  136. 136. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  137. 137. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal)Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  138. 138. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  139. 139. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  140. 140. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  141. 141. DEVISECarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  142. 142. DEVISE Não é uma Rails::Application.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  143. 143. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  144. 144. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin. (e NÃO DEVE ser instalado como tal)Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  145. 145. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  146. 146. 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, comcontrollers, helpers, mailers, views e rotas, mas não é capaz de rodar isoladamente.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  147. 147. CRIANDO UMA GEMCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  148. 148. BUNDLERCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  149. 149. BUNDLER bundle gem ruby_mastersCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  150. 150. 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.Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  151. 151. 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.rb Initializating git repo in ~/Projects/ruby_mastersCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  152. 152. BUNDLE GEM Gemfile source "http://rubygems.org" # Specify your gems dependencies in ruby_masters.gemspec gemspecCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  153. 153. BUNDLE GEM Rakefile require bundler Bundler::GemHelper.install_tasksCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  154. 154. BUNDLE GEM ruby_masters.gemspec # -*- 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" # ... continua endCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  155. 155. BUNDLE GEM lib/ruby_masters.rb module RubyMasters # Your code goes here... endCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  156. 156. BUNDLE GEM lib/ruby_masters/version.rb module RubyMasters VERSION = "0.0.1" endCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  157. 157. 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 RubygemsCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  158. 158. RAILTIE?Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  159. 159. 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 {} end endCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  160. 160. BUNDLE GEM + RAILTIE OuCarlos Antonio blog.plataformatec.com.br @cantoniodasilva
  161. 161. BUNDLE GEM + RAILTIE lib/ruby_masters.rb lib/ruby_masters/railtie.rb module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters =require "ruby_masters/railtie" ActiveSupport::OrderedOptions.new # rake_tasks {}module RubyMasters # generators {} # Your code goes here... # console {}end # config.to_prepare {} # initializer {} end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  162. 162. BUNDLER <3Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  163. 163. RAILS 3Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  164. 164. @cantoniodasilva?! blog.plataformatec.com.br Obrigado !

×