SlideShare uma empresa Scribd logo
1 de 164
Baixar para ler offline
RAILTIES
                                  OU


              COMO DESENVOLVER
            PLUGINS/GEMS PARA RAILS


    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
$ WHOAMI




    Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
CARLOS ANTONIO DA SILVA

                         @cantoniodasilva


    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
COMECEI COM
       DESENVOLVIMENTO EM 2003

      E COM RUBY E RAILS EM 2007


    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
TRABALHO NA




    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
DEVISE




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
SIMPLE_FORM




    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RESPONDERS




    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
THE ROAD SO FAR

                             RAILS 2.3


    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

                         Já possuía a estrutura de Rails Engine.




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

                         Já possuía a estrutura de Rails Engine.


                                            Mas...




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
RAILS 2.3




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

    Carlos Antonio                        blog.plataformatec.com.br                     @cantoniodasilva
Sunday, November 6, 11
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.rb

    Carlos Antonio                              blog.plataformatec.com.br                         @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

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




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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.



    Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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.rb

    Carlos Antonio                                blog.plataformatec.com.br                         @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

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




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
RAILS 2.3

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




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
RAILS 2.3




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

    Carlos Antonio                     blog.plataformatec.com.br                    @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

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




    Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
RAILS 2.3
    module 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
      end
    end




    Carlos Antonio                        blog.plataformatec.com.br                   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3

    module Rails
      class Configuration

           private

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

      end
    end




    Carlos Antonio                         blog.plataformatec.com.br                   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3


                             SINGLE
                         RESPONSIBILITY
                           PRINCIPLE


    Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3


                             SINGLE
                         RESPONSIBILITY
                           PRINCIPLE


    Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 2.3




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
NOW

                         RAILS 3


    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3


                               Modularidade.


                         API pública e bem definida.




    Carlos Antonio             blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3



                                                                 HOOKS!



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

    Carlos Antonio                   blog.plataformatec.com.br              @cantoniodasilva
Sunday, November 6, 11
RAILS 3

                         O Rails não conhece o ActiveRecord.




    Carlos Antonio                  blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
RAILS 3



     E isso acontece com todos os outros frameworks.




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3

              ActiveRecord                               ActionView


     E isso acontece com todos os outros frameworks.

       ActiveResource
                                                         ActionController
                             ActionMailer


    Carlos Antonio           blog.plataformatec.com.br          @cantoniodasilva
Sunday, November 6, 11
RAILS 3



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




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3

               DataMapper                               Mongoid

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


    Carlos Antonio          blog.plataformatec.com.br        @cantoniodasilva
Sunday, November 6, 11
EXEMPLO REAL???




    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
    Sunday, November 6, 11
RAILS 3


                             SINGLE
                         RESPONSIBILITY
                           PRINCIPLE


    Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3




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

    Carlos Antonio                     blog.plataformatec.com.br                @cantoniodasilva
Sunday, November 6, 11
Railties

?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Railties

?
                                         WTF???
        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Railties
?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Railties                    Engine

?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Application       Railties                    Engine

?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Initialization




           Application       Railties                    Engine

?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Initialization




           Application       Railties                    Engine

?
                               Generators


        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Initialization




?      HOOKS
           Application       Railties                    Engine




                               Generators


        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
CONFIGURAÇÃO
?

        Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
GENERATORS
?

        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
GENERATORS

                             module MyGem
                               class Railtie < ::Rails::Railtie

                                 generators do
                                   require "my_gem/generator"
                                 end

?                              end
                             end




        Carlos Antonio                blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
GENERATORS


                             Preciso realmente adicionar na Railtie?


?

        Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
GENERATORS


                             Preciso realmente adicionar na Railtie?


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




        Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
GENERATORS


                                                       Siga as convenções.


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

        Carlos Antonio                    blog.plataformatec.com.br               @cantoniodasilva
    Sunday, November 6, 11
GENERATORS


                                                       Siga as convenções.


?                                                 E você será mais feliz =).



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

        Carlos Antonio                    blog.plataformatec.com.br               @cantoniodasilva
    Sunday, November 6, 11
GENERATORS - HOOKS
?

        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
RAKE TASKS
?

        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
CONSOLE
?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
INITIALIZATION HOOKS




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

        Carlos Antonio                     blog.plataformatec.com.br              @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
INITIALIZERS
?

        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
FRAMEWORK LOADING
?

        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
E O QUE EU FAÇO COM
                      ESSE NEGÓCIO DE
                   FRAMEWORK LOADING?



    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
E O QUE EU FAÇO COM
                      ESSE NEGÓCIO DE
                   FRAMEWORK LOADING?



    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
COMO EU CRIO UMA
                               RAILS::RAILTIE???
?

        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::RAILTIE => COMO?

                             module MyGem
                               class Railtie < ::Rails::Railtie

                                 # Acabamos de criar nossa railtie.


?                              end
                             end




        Carlos Antonio                   blog.plataformatec.com.br    @cantoniodasilva
    Sunday, November 6, 11
E QUANDO EU REALMENTE
         PRECISO DE UMA RAILS::RAILTIE???
?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
EXEMPLO REAL???




    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
    Sunday, November 6, 11
Rails::Engine
?
                             Rails::Railtie + Paths + Autoload


        Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
COMO EU CRIO UMA
                               RAILS::ENGINE???
?

        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::ENGINE => COMO?

                              module MyGem
                                class Engine < ::Rails::Engine

                                  # Acabamos de criar nossa engine.


?                               end
                              end




        Carlos Antonio                    blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
E QUANDO EU PRECISO DE UMA
               RAILS::ENGINE???
?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::ENGINE => QUANDO?



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

?

        Carlos Antonio               blog.plataformatec.com.br        @cantoniodasilva
    Sunday, November 6, 11
EXEMPLO REAL???




    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
    Sunday, November 6, 11
Rails::Plugin
?
                             Rails::Engine + interno ao Rails


        Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::PLUGIN

                             Engine com alguns conhecimentos
                              extras para carregar os plugins.


?

        Carlos Antonio                 blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
RAILS::PLUGIN

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


?

        Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
COMO EU CRIO UM
                              RAILS::PLUGIN???
?

        Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::PLUGIN => COMO?



                                   rails plugin install
                                       rails server
?

        Carlos Antonio              blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
E QUANDO EU PRECISO DE UM
                   RAILS::PLUGIN???
?

        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::PLUGIN => QUANDO?



                             Nunca. Lembre-se: é interno ao Rails.

?

        Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
Rails::Application
?
                              Rails::Engine + App Bootstrap


        Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
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
    Sunday, November 6, 11
RAILS::APPLICATION
                             Possui as configurações relativas a
                             aplicação, como o “cache_classes”.



?

        Carlos Antonio                 blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
RAILS::APPLICATION

                                   Highlander!




?

        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
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
    Sunday, November 6, 11
COMO EU CRIO UMA
                             RAILS::APPLICATION???
?

        Carlos Antonio             blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RAILS::APPLICATION => COMO?


                             rails new my_app
                                 cd my_app
                                 rails server
?

        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
    Sunday, November 6, 11
RESUMO




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
SIMPLE_FORM




    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
SIMPLE_FORM

                         Não é uma Rails::Application.




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
SIMPLE_FORM

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




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
RESPONDERS




    Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RESPONDERS

                         Não é uma Rails::Application.




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RESPONDERS

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




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
DEVISE




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
DEVISE

                         Não é uma Rails::Application.




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
DEVISE

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




    Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
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
Sunday, November 6, 11
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.



    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
CRIANDO UMA GEM




    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
BUNDLER




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
BUNDLER



                         bundle gem ruby_masters




    Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
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_masters




    Carlos Antonio                            blog.plataformatec.com.br                 @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM

                                          Gemfile


                         source "http://rubygems.org"

                         # Specify your gem's dependencies in
                         ruby_masters.gemspec
                         gemspec




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM

                                          Rakefile



                         require 'bundler'
                         Bundler::GemHelper.install_tasks




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
                         end


    Carlos Antonio                    blog.plataformatec.com.br                 @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM

                                lib/ruby_masters.rb



                         module RubyMasters
                           # Your code goes here...
                         end




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM

                         lib/ruby_masters/version.rb



                         module RubyMasters
                           VERSION = "0.0.1"
                         end




    Carlos Antonio                   blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM

                                       rake tasks

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




    Carlos Antonio                  blog.plataformatec.com.br                @cantoniodasilva
Sunday, November 6, 11
RAILTIE?




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
                         end




    Carlos Antonio                          blog.plataformatec.com.br               @cantoniodasilva
Sunday, November 6, 11
BUNDLE GEM + RAILTIE



                                        Ou




    Carlos Antonio             blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
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
Sunday, November 6, 11
BUNDLER <3




    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
RAILS 3




    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Sunday, November 6, 11
@cantoniodasilva
                         ?!       blog.plataformatec.com.br



                              Obrigado
                                     !


Sunday, November 6, 11

Mais conteúdo relacionado

Destaque

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

railties @ ruby mastersconf - 2011.02.26

  • 1. RAILTIES OU COMO DESENVOLVER PLUGINS/GEMS PARA RAILS Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 2. $ WHOAMI Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 3. CARLOS ANTONIO DA SILVA @cantoniodasilva Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 4. COMECEI COM DESENVOLVIMENTO EM 2003 E COM RUBY E RAILS EM 2007 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 5. TRABALHO NA Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 6. DEVISE Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 7. SIMPLE_FORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 8. RESPONDERS Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 9. THE ROAD SO FAR RAILS 2.3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 10. RAILS 2.3 Já possuía a estrutura de Rails Engine. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 11. RAILS 2.3 Já possuía a estrutura de Rails Engine. Mas... Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 13. RAILS 2.3 http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpg Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 15. RAILS 2.3 Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 16. 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 18. RAILS 2.3 Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper... Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 20. RAILS 2.3 Não existia uma API pública definida para outros frameworks se integrarem. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 22. RAILS 2.3 http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpg Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 23. RAILS 2.3 O Rails sabia da existência do ActiveRecord... Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 26. RAILS 2.3 module 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 end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 27. RAILS 2.3 module Rails class Configuration private def default_frameworks [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 28. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 29. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 30. RAILS 2.3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 31. NOW RAILS 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 32. RAILS 3 Modularidade. API pública e bem definida. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 33. RAILS 3 HOOKS! http://www.flickr.com/photos/ooh_food/3304708302/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 34. RAILS 3 O Rails não conhece o ActiveRecord. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 36. RAILS 3 E isso acontece com todos os outros frameworks. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 37. RAILS 3 ActiveRecord ActionView E isso acontece com todos os outros frameworks. ActiveResource ActionController ActionMailer Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 38. RAILS 3 E isso acontece com todas as demais gems/plugins que se integram com o Rails. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 39. RAILS 3 DataMapper Mongoid E isso acontece com todas as demais gems/plugins que se integram com o Rails. outros... RSpec Devise Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 40. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 42. RAILS 3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 43. RAILS 3 WIN!!! http://www.flickr.com/photos/simoncopping/5050597808/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 44. Railties ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 45. Railties ? WTF??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 46. Railties ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 47. Railties Engine ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 48. Application Railties Engine ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 49. Initialization Application Railties Engine ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 50. Initialization Application Railties Engine ? Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 51. Initialization ? HOOKS Application Railties Engine Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 52. CONFIGURAÇÃO ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 54. GENERATORS ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 55. GENERATORS module MyGem class Railtie < ::Rails::Railtie generators do require "my_gem/generator" end ? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 56. GENERATORS Preciso realmente adicionar na Railtie? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 57. GENERATORS Preciso realmente adicionar na Railtie? ? Não, se você seguir a convenção. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 61. GENERATORS Siga as convenções. ? http://www.flickr.com/photos/jasonteale/1340004498/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 63. GENERATORS - HOOKS ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 68. RAKE TASKS ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 70. CONSOLE ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 72. INITIALIZATION HOOKS ? http://www.flickr.com/photos/mattbrett/224471090/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 80. INITIALIZERS ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 83. FRAMEWORK LOADING ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 86. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 87. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 90. COMO EU CRIO UMA RAILS::RAILTIE??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 91. RAILS::RAILTIE => COMO? module MyGem class Railtie < ::Rails::Railtie # Acabamos de criar nossa railtie. ? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 92. E QUANDO EU REALMENTE PRECISO DE UMA RAILS::RAILTIE??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 94. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 96. Rails::Engine ? Rails::Railtie + Paths + Autoload Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 102. COMO EU CRIO UMA RAILS::ENGINE??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 103. RAILS::ENGINE => COMO? module MyGem class Engine < ::Rails::Engine # Acabamos de criar nossa engine. ? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 104. E QUANDO EU PRECISO DE UMA RAILS::ENGINE??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 105. RAILS::ENGINE => QUANDO? • Suas extensões precisarem de: rotas, controllers, views ou mailers, por exemplo. ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 106. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 108. Rails::Plugin ? Rails::Engine + interno ao Rails Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 109. RAILS::PLUGIN Engine com alguns conhecimentos extras para carregar os plugins. ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 111. RAILS::PLUGIN Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin. ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 113. COMO EU CRIO UM RAILS::PLUGIN??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 114. RAILS::PLUGIN => COMO? rails plugin install rails server ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 115. E QUANDO EU PRECISO DE UM RAILS::PLUGIN??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 116. RAILS::PLUGIN => QUANDO? Nunca. Lembre-se: é interno ao Rails. ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 117. Rails::Application ? Rails::Engine + App Bootstrap Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 120. RAILS::APPLICATION Possui as configurações relativas a aplicação, como o “cache_classes”. ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 122. RAILS::APPLICATION Highlander! ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 124. COMO EU CRIO UMA RAILS::APPLICATION??? ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 125. RAILS::APPLICATION => COMO? rails new my_app cd my_app rails server ? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 126. RESUMO Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 127. SIMPLE_FORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 128. SIMPLE_FORM Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 129. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 134. RESPONDERS Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 135. RESPONDERS Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 136. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 141. DEVISE Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 142. DEVISE Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 143. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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, com controllers, helpers, mailers, views e rotas, mas não é capaz de rodar isoladamente. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 147. CRIANDO UMA GEM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 148. BUNDLER Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 149. BUNDLER bundle gem ruby_masters Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 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_masters Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 152. BUNDLE GEM Gemfile source "http://rubygems.org" # Specify your gem's dependencies in ruby_masters.gemspec gemspec Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 153. BUNDLE GEM Rakefile require 'bundler' Bundler::GemHelper.install_tasks Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 155. BUNDLE GEM lib/ruby_masters.rb module RubyMasters # Your code goes here... end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 156. BUNDLE GEM lib/ruby_masters/version.rb module RubyMasters VERSION = "0.0.1" end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 157. BUNDLE GEM rake tasks ~/Projects/ruby_masters [ree-1.8.7@rubymasters] $ rake -T rake build # Build ruby_masters-0.0.1.gem into the pkg directory rake install # Build and install ruby_masters-0.0.1.gem into system gems rake release # Create tag v0.0.1 and build and push ruby_masters-0.0.1.gem to Rubygems Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 158. RAILTIE? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 160. BUNDLE GEM + RAILTIE Ou Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 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 Sunday, November 6, 11
  • 162. BUNDLER <3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 163. RAILS 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  • 164. @cantoniodasilva ?! blog.plataformatec.com.br Obrigado ! Sunday, November 6, 11