RAILTIES                                  OU              COMO DESENVOLVER            PLUGINS/GEMS PARA RAILS    Carlos An...
$ WHOAMI    Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
CARLOS ANTONIO DA SILVA                         @cantoniodasilva    Carlos Antonio           blog.plataformatec.com.br   @...
COMECEI COM       DESENVOLVIMENTO EM 2003      E COM RUBY E RAILS EM 2007    Carlos Antonio       blog.plataformatec.com.b...
TRABALHO NA    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
DEVISE    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
SIMPLE_FORM    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
RESPONDERS    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
THE ROAD SO FAR                             RAILS 2.3    Carlos Antonio           blog.plataformatec.com.br   @cantoniodas...
RAILS 2.3                         Já possuía a estrutura de Rails Engine.    Carlos Antonio                   blog.platafo...
RAILS 2.3                         Já possuía a estrutura de Rails Engine.                                            Mas.....
RAILS 2.3                         Já possuía a estrutura de Rails Engine.                              Mas...            p...
RAILS 2.3         http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpg    Carlos ...
RAILS 2.3                             module Rails                               class Plugin                             ...
RAILS 2.3     Diretórios como app/[models|controllers|helpers]      e as rotas eram automaticamente carregados.    Carlos ...
RAILS 2.3     Diretórios como app/[models|controllers|helpers]      e as rotas eram automaticamente carregados.           ...
RAILS 2.3                  module Rails                    class Plugin                         def view_path             ...
RAILS 2.3        Tínhamos ORMs diferentes “integradas” ao Rails,           como o Datamapper e o MongoMapper...    Carlos ...
RAILS 2.3        Tínhamos ORMs diferentes “integradas” ao Rails,           como o Datamapper e o MongoMapper...     Que po...
RAILS 2.3       Não existia uma API pública definida para outros                  frameworks se integrarem.    Carlos Anton...
RAILS 2.3       Não existia uma API pública definida para outros                  frameworks se integrarem.           A sol...
RAILS 2.3   http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpg    Carlos A...
RAILS 2.3            O Rails sabia da existência do ActiveRecord...    Carlos Antonio          blog.plataformatec.com.br  ...
RAILS 2.3            O Rails sabia da existência do ActiveRecord...                  Pois era ele o responsável por inicia...
RAILS 2.3        Isso quer dizer que, por mais que você estivesse        utilizando o DataMapper ou MongoMapper, por      ...
RAILS 2.3    module Rails      class Initializer        # Requires all frameworks specified by the Configuration#framework...
RAILS 2.3    module Rails      class Configuration           private              def default_frameworks                [ ...
RAILS 2.3                             SINGLE                         RESPONSIBILITY                           PRINCIPLE   ...
RAILS 2.3                             SINGLE                         RESPONSIBILITY                           PRINCIPLE   ...
RAILS 2.3    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
NOW                         RAILS 3    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6...
RAILS 3                               Modularidade.                         API pública e bem definida.    Carlos Antonio  ...
RAILS 3                                                                 HOOKS!                         http://www.flickr.co...
RAILS 3                         O Rails não conhece o ActiveRecord.    Carlos Antonio                  blog.plataformatec....
RAILS 3                         O Rails não conhece o ActiveRecord.      O ActiveRecord é quem conta para o Rails como    ...
RAILS 3     E isso acontece com todos os outros frameworks.    Carlos Antonio       blog.plataformatec.com.br   @cantoniod...
RAILS 3              ActiveRecord                               ActionView     E isso acontece com todos os outros framewo...
RAILS 3    E isso acontece com todas as demais gems/plugins               que se integram com o Rails.    Carlos Antonio  ...
RAILS 3               DataMapper                               Mongoid    E isso acontece com todas as demais gems/plugins...
EXEMPLO REAL???    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
module ActiveRecord                        class Railtie < Rails::Railtie                          config.active_record = ...
RAILS 3                             SINGLE                         RESPONSIBILITY                           PRINCIPLE    C...
RAILS 3                                                         WIN!!!                         http://www.flickr.com/photos...
Railties?        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
Railties?                                         WTF???        Carlos Antonio       blog.plataformatec.com.br   @cantonio...
Railties?        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
Railties                    Engine?        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva    Sunday, No...
Application       Railties                    Engine?        Carlos Antonio       blog.plataformatec.com.br   @cantoniodas...
Initialization           Application       Railties                    Engine?        Carlos Antonio       blog.plataforma...
Initialization           Application       Railties                    Engine?                               Generators   ...
Initialization?      HOOKS           Application       Railties                    Engine                               Ge...
CONFIGURAÇÃO?        Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
CONFIGURAÇÃO       module Responders         class Railtie < ::Rails::Railtie                  config.responders = ActiveS...
GENERATORS?        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
GENERATORS                             module MyGem                               class Railtie < ::Rails::Railtie        ...
GENERATORS                             Preciso realmente adicionar na Railtie??        Carlos Antonio                   bl...
GENERATORS                             Preciso realmente adicionar na Railtie??                              Não, se você ...
GENERATORS                               simple_form                                 lib                                  ...
GENERATORS                               simple_form                                 lib                       Namespace  ...
GENERATORS               module SimpleForm                 module Generators                   class InstallGenerator < Ra...
GENERATORS                                                       Siga as convenções.?                             http://w...
GENERATORS                                                       Siga as convenções.?                                     ...
GENERATORS - HOOKS?        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
GENERATORS - ORM       module Rails         module Mongoid           class Railtie < Rails::Railtie                       ...
GENERATORS - TEST FRAMEWORK       module Rails         module RSpec           class Railtie < Rails::Railtie              ...
GENERATORS - TEMPLATE ENGINE       module Rails         module Haml           class Railtie < Rails::Railtie              ...
GENERATORS - MAIS OPÇÕES?                       :helper                                  =>    true,                      ...
RAKE TASKS?        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
RAKE TASKS                         module Rails                           module RSpec                             class R...
CONSOLE?        Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
CONSOLE                             module ActiveRecord                               class Railtie < Rails::Railtie      ...
INITIALIZATION HOOKS?                               http://www.flickr.com/photos/mattbrett/224471090/        Carlos Antonio...
INITIALIZATION HOOKS             module MyGem               class Railtie < Rails::Railtie                        config.b...
INITIALIZATION HOOKS             module MyGem               class Railtie < Rails::Railtie                        config.b...
INITIALIZATION HOOKS             module MyGem               class Railtie < Rails::Railtie                        config.t...
INITIALIZATION HOOKS             module MyGem               class Railtie < Rails::Railtie                        config.b...
INITIALIZATION HOOKS             module MyGem               class Railtie < Rails::Railtie                        config.a...
INITIALIZATION HOOKS                      Development                             Production (cache_classes)              ...
INITIALIZATION HOOKS                      Development                             Production (cache_classes)              ...
INITIALIZERS?        Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
INITIALIZERS             module CarrierWave               class Railtie < Rails::Railtie                        # Initiali...
INITIALIZERS                             module MyGem                               class Railtie < Rails::Railtie        ...
FRAMEWORK LOADING?        Carlos Antonio            blog.plataformatec.com.br   @cantoniodasilva    Sunday, November 6, 11
FRAMEWORK LOADING                       # Cada módulo avisa através do ActiveSupport                       # quando é carr...
FRAMEWORK LOADING                       # E podemos executar código neste exato                       # momento, dentro do...
E O QUE EU FAÇO COM                      ESSE NEGÓCIO DE                   FRAMEWORK LOADING?    Carlos Antonio       blog...
E O QUE EU FAÇO COM                      ESSE NEGÓCIO DE                   FRAMEWORK LOADING?    Carlos Antonio       blog...
FRAMEWORK LOADING +                                  INITIALIZERS             module Devise               class Engine < :...
FRAMEWORK LOADING                              E você pode criar o seu hook.?                      ActiveSupport.run_load_...
COMO EU CRIO UMA                               RAILS::RAILTIE????        Carlos Antonio            blog.plataformatec.com....
RAILS::RAILTIE => COMO?                             module MyGem                               class Railtie < ::Rails::Ra...
E QUANDO EU REALMENTE         PRECISO DE UMA RAILS::RAILTIE????        Carlos Antonio       blog.plataformatec.com.br   @c...
RAILS::RAILTIE => QUANDO?             • Precisar carregar generators em outro diretório;             • Precisar de rake ta...
EXEMPLO REAL???    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
module Responders        class Railtie < ::Rails::Railtie          config.responders = ActiveSupport::OrderedOptions.new  ...
Rails::Engine?                             Rails::Railtie + Paths + Autoload        Carlos Antonio               blog.plat...
RAILS::ENGINE                              app/controllers                              app/helpers                       ...
RAILS::ENGINE                      Carrega automaticamente controllers,                    helpers, models, mailers e view...
RAILS::ENGINE                              O diretório lib é adicionado ao                                 autoload_path d...
RAILS::ENGINE                                   O que não é carregado                               automaticamente pela E...
RAILS::ENGINE                      module MyGem                        class Engine < ::Rails::Engine                     ...
COMO EU CRIO UMA                               RAILS::ENGINE????        Carlos Antonio            blog.plataformatec.com.b...
RAILS::ENGINE => COMO?                              module MyGem                                class Engine < ::Rails::En...
E QUANDO EU PRECISO DE UMA               RAILS::ENGINE????        Carlos Antonio       blog.plataformatec.com.br   @canton...
RAILS::ENGINE => QUANDO?             • Suas extensões precisarem de: rotas, controllers, views ou             mailers, por...
EXEMPLO REAL???    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
module Devise          class Engine < ::Rails::Engine            config.devise = Devise               # Initialize Warden ...
Rails::Plugin?                             Rails::Engine + interno ao Rails        Carlos Antonio               blog.plata...
RAILS::PLUGIN                             Engine com alguns conhecimentos                              extras para carrega...
RAILS::PLUGIN                             Engine com alguns conhecimentos                              extras para carrega...
RAILS::PLUGIN                   Cada plugin em vendor/plugins é carregado                        pelo Rails como um Rails:...
RAILS::PLUGIN                   Cada plugin em vendor/plugins é carregado                        pelo Rails como um Rails:...
COMO EU CRIO UM                              RAILS::PLUGIN????        Carlos Antonio           blog.plataformatec.com.br  ...
RAILS::PLUGIN => COMO?                                   rails plugin install                                       rails ...
E QUANDO EU PRECISO DE UM                   RAILS::PLUGIN????        Carlos Antonio       blog.plataformatec.com.br   @can...
RAILS::PLUGIN => QUANDO?                             Nunca. Lembre-se: é interno ao Rails.?        Carlos Antonio         ...
Rails::Application?                              Rails::Engine + App Bootstrap        Carlos Antonio               blog.pl...
RAILS::APPLICATION                               Engine com super powers e a                             responsabilidade ...
RAILS::APPLICATION                               Engine com super powers e a                             responsabilidade ...
RAILS::APPLICATION                             Possui as configurações relativas a                             aplicação, c...
RAILS::APPLICATION                              Possui as configurações relativas a                              aplicação,...
RAILS::APPLICATION                                   Highlander!?        Carlos Antonio            blog.plataformatec.com....
RAILS::APPLICATION                                                        Highlander!?          raise "You cannot have mor...
COMO EU CRIO UMA                             RAILS::APPLICATION????        Carlos Antonio             blog.plataformatec.c...
RAILS::APPLICATION => COMO?                             rails new my_app                                 cd my_app        ...
RESUMO    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
SIMPLE_FORM    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
SIMPLE_FORM                         Não é uma Rails::Application.    Carlos Antonio               blog.plataformatec.com.b...
SIMPLE_FORM                         Não é uma Rails::Application.                           Não é um Rails::Plugin.    Car...
SIMPLE_FORM                         Não é uma Rails::Application.                           Não é um Rails::Plugin.       ...
SIMPLE_FORM                         Não é uma Rails::Application.                           Não é um Rails::Plugin.       ...
SIMPLE_FORM                         Não é uma Rails::Application.                           Não é um Rails::Plugin.       ...
SIMPLE_FORM                            Nenhum hook é necessário,                             podemos apenas utilizar a    ...
RESPONDERS    Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
RESPONDERS                         Não é uma Rails::Application.    Carlos Antonio               blog.plataformatec.com.br...
RESPONDERS                         Não é uma Rails::Application.                           Não é um Rails::Plugin.    Carl...
RESPONDERS                         Não é uma Rails::Application.                           Não é um Rails::Plugin.        ...
RESPONDERS                         Não é uma Rails::Application.                           Não é um Rails::Plugin.        ...
RESPONDERS                         Não é uma Rails::Application.                           Não é um Rails::Plugin.        ...
RESPONDERS        Permite configuração através do objeto :config;              Utiliza alguns hooks de inicialização;       ...
DEVISE    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
DEVISE                         Não é uma Rails::Application.    Carlos Antonio               blog.plataformatec.com.br   @...
DEVISE                         Não é uma Rails::Application.                           Não é um Rails::Plugin.    Carlos A...
DEVISE                         Não é uma Rails::Application.                           Não é um Rails::Plugin.            ...
DEVISE                         Não é uma Rails::Application.                           Não é um Rails::Plugin.            ...
DEVISE     Permite configuração através do objeto :config;            Utiliza alguns hooks de inicialização;                ...
CRIANDO UMA GEM    Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
BUNDLER    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
BUNDLER                         bundle gem ruby_masters    Carlos Antonio            blog.plataformatec.com.br   @cantonio...
BUNDLE GEM             Cria a estrutura de diretórios basica da gem.         Cria um arquivo Rakefile carregando tarefas do...
BUNDLE GEM                         ~/Projects [ree-1.8.7@rubymasters] $ bundle gem ruby_masters                           ...
BUNDLE GEM                                          Gemfile                         source "http://rubygems.org"           ...
BUNDLE GEM                                          Rakefile                         require bundler                       ...
BUNDLE GEM                             ruby_masters.gemspec                         # -*- encoding: utf-8 -*-             ...
BUNDLE GEM                                lib/ruby_masters.rb                         module RubyMasters                  ...
BUNDLE GEM                         lib/ruby_masters/version.rb                         module RubyMasters                 ...
BUNDLE GEM                                       rake tasks     ~/Projects/ruby_masters [ree-1.8.7@rubymasters] $ rake -T ...
RAILTIE?    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
BUNDLE GEM + RAILTIE                                      lib/ruby_masters.rb                         module RubyMasters  ...
BUNDLE GEM + RAILTIE                                        Ou    Carlos Antonio             blog.plataformatec.com.br   @...
BUNDLE GEM + RAILTIE    lib/ruby_masters.rb                      lib/ruby_masters/railtie.rb                              ...
BUNDLER <3    Carlos Antonio         blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
RAILS 3    Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilvaSunday, November 6, 11
@cantoniodasilva                         ?!       blog.plataformatec.com.br                              Obrigado         ...
Upcoming SlideShare
Loading in...5
×

railties @ ruby mastersconf - 2011.02.26

521

Published on

Railties presentation at Ruby MastersConf 2011.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
521
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

railties @ ruby mastersconf - 2011.02.26

  1. 1. RAILTIES OU COMO DESENVOLVER PLUGINS/GEMS PARA RAILS Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  2. 2. $ WHOAMI Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  3. 3. CARLOS ANTONIO DA SILVA @cantoniodasilva Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  4. 4. COMECEI COM DESENVOLVIMENTO EM 2003 E COM RUBY E RAILS EM 2007 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  5. 5. TRABALHO NA Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  6. 6. DEVISE Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  7. 7. SIMPLE_FORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  8. 8. RESPONDERS Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  9. 9. THE ROAD SO FAR RAILS 2.3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  10. 10. RAILS 2.3 Já possuía a estrutura de Rails Engine. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  11. 11. RAILS 2.3 Já possuía a estrutura de Rails Engine. Mas... Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  12. 12. RAILS 2.3 Já possuía a estrutura de Rails Engine. Mas... podemos dizer que era uma boa “gambiarra”. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  13. 13. RAILS 2.3 http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpg Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  14. 14. RAILS 2.3 module Rails class Plugin # Engines are plugins with an app/ directory. def engine? has_app_directory? end private def has_app_directory? File.directory?(File.join(directory, app)) end end end https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  15. 15. RAILS 2.3 Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  16. 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 @cantoniodasilvaSunday, November 6, 11
  17. 17. RAILS 2.3 module Rails class Plugin def view_path File.join(directory, app, views) end def controller_path File.join(directory, app, controllers) end def routing_file File.join(directory, config, routes.rb) end private def app_paths [ File.join(directory, app, models), File.join(directory, app, helpers), controller_path, metal_path ] end end end https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  18. 18. RAILS 2.3 Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper... Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  19. 19. RAILS 2.3 Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper... Que poderiam quebrar a cada novo patch release do Rails. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  20. 20. RAILS 2.3 Não existia uma API pública definida para outros frameworks se integrarem. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  21. 21. RAILS 2.3 Não existia uma API pública definida para outros frameworks se integrarem. A solução: alias method chain / monkey patch. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  22. 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 @cantoniodasilvaSunday, November 6, 11
  23. 23. RAILS 2.3 O Rails sabia da existência do ActiveRecord... Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  24. 24. RAILS 2.3 O Rails sabia da existência do ActiveRecord... Pois era ele o responsável por inicializar o ActiveRecord e os demais frameworks. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  25. 25. RAILS 2.3 Isso quer dizer que, por mais que você estivesse utilizando o DataMapper ou MongoMapper, por exemplo, o ActiveRecord sempre estaria lá. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  26. 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 @cantoniodasilvaSunday, November 6, 11
  27. 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 @cantoniodasilvaSunday, November 6, 11
  28. 28. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  29. 29. RAILS 2.3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  30. 30. RAILS 2.3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  31. 31. NOW RAILS 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  32. 32. RAILS 3 Modularidade. API pública e bem definida. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  33. 33. RAILS 3 HOOKS! http://www.flickr.com/photos/ooh_food/3304708302/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  34. 34. RAILS 3 O Rails não conhece o ActiveRecord. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  35. 35. RAILS 3 O Rails não conhece o ActiveRecord. O ActiveRecord é quem conta para o Rails como ele deve ser inicializado. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  36. 36. RAILS 3 E isso acontece com todos os outros frameworks. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  37. 37. RAILS 3 ActiveRecord ActionView E isso acontece com todos os outros frameworks. ActiveResource ActionController ActionMailer Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  38. 38. RAILS 3 E isso acontece com todas as demais gems/plugins que se integram com o Rails. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  39. 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 @cantoniodasilvaSunday, November 6, 11
  40. 40. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  41. 41. module ActiveRecord class Railtie < Rails::Railtie config.active_record = ActiveSupport::OrderedOptions.new config.generators.orm :active_record, :migration => true, :timestamps => true config.app_middleware.insert_after "::ActionDispatch::Callbacks", "ActiveRecord::QueryCache" rake_tasks do load "active_record/railties/databases.rake" end console do ActiveRecord::Base end initializer "active_record.logger" do? ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger } end config.after_initialize do ActiveSupport.on_load(:active_record) do instantiate_observers # .... end end end end https://github.com/rails/rails/tree/3-0-stable/activerecord Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  42. 42. RAILS 3 SINGLE RESPONSIBILITY PRINCIPLE Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  43. 43. RAILS 3 WIN!!! http://www.flickr.com/photos/simoncopping/5050597808/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  44. 44. Railties? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  45. 45. Railties? WTF??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  46. 46. Railties? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  47. 47. Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  48. 48. Application Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  49. 49. Initialization Application Railties Engine? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  50. 50. Initialization Application Railties Engine? Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  51. 51. Initialization? HOOKS Application Railties Engine Generators Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  52. 52. CONFIGURAÇÃO? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  53. 53. CONFIGURAÇÃO module Responders class Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new # Na configuração da app (application.rb):? # config.responders.flash_keys = [:notice, :failure] end end https://github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  54. 54. GENERATORS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  55. 55. GENERATORS module MyGem class Railtie < ::Rails::Railtie generators do require "my_gem/generator" end? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  56. 56. GENERATORS Preciso realmente adicionar na Railtie?? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  57. 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. 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. 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. 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. 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. 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. 63. GENERATORS - HOOKS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  64. 64. GENERATORS - ORM module Rails module Mongoid class Railtie < Rails::Railtie config.generators.orm :mongoid, :migration => false? end end end https://github.com/mongoid/mongoid Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  65. 65. GENERATORS - TEST FRAMEWORK module Rails module RSpec class Railtie < Rails::Railtie config.generators.test_framework :rspec? end end end https://github.com/rspec/rspec-rails Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  66. 66. GENERATORS - TEMPLATE ENGINE module Rails module Haml class Railtie < Rails::Railtie config.generators.template_engine :haml? end end end https://github.com/nex3/haml Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  67. 67. GENERATORS - MAIS OPÇÕES? :helper => true, :orm => nil, :integration_tool => nil, :performance_tool => nil, :resource_controller => :controller, :scaffold_controller => :scaffold_controller,? :stylesheets :test_framework :template_engine => => => true, nil, :erb https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/generators.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  68. 68. RAKE TASKS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  69. 69. RAKE TASKS module Rails module RSpec class Railtie < Rails::Railtie rake_tasks do load "rspec/rails/tasks/rspec.rake" end? end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  70. 70. CONSOLE? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  71. 71. CONSOLE module ActiveRecord class Railtie < Rails::Railtie # Forçar o carregamento do # ActiveRecord com o console. console do ActiveRecord::Base? end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  72. 72. INITIALIZATION HOOKS? http://www.flickr.com/photos/mattbrett/224471090/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  73. 73. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.before_configuration { # Roda após criar a classe da Aplicação, mas? # antes de rodar as configurações do usuário. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  74. 74. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.before_initialize { # Roda depois da configuração do usuário, mas? # antes dos initializers. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  75. 75. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.to_prepare { # Roda antes de cada request em development, e? # antes da primeira request em production. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  76. 76. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.before_eager_load { # Roda antes do Rails carregar todo o código # da aplicação. Isso só acontece com a opção? } # :cache_classes habilitada (production). end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  77. 77. INITIALIZATION HOOKS module MyGem class Railtie < Rails::Railtie config.after_initialize { # Roda após a inicialização do Rails, # configurações do usuário e initializers, e o? # próprio bloco to_prepare. É executado apenas # uma única vez, antes da primeira requisição. } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  78. 78. INITIALIZATION HOOKS Development Production (cache_classes) before_configuration before_configuration => Booting WEBrick => Booting WEBrick before_initialize before_initialize to_prepare to_prepare? after_initialize before_eager_load [...] INFO WEBrick 1.3.1 after_initialize [...] INFO WEBrick 1.3.1 to_prepare Request... Request... to_prepare Request... Request... to_prepare Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  79. 79. INITIALIZATION HOOKS Development Production (cache_classes) before_configuration before_configuration => Booting WEBrick => Booting WEBrick before_initialize before_initialize to_prepare to_prepare? after_initialize before_eager_load [...] INFO WEBrick 1.3.1 after_initialize [...] INFO WEBrick 1.3.1 to_prepare Request... Request... to_prepare Request... Request... to_prepare Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  80. 80. INITIALIZERS? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  81. 81. INITIALIZERS module CarrierWave class Railtie < Rails::Railtie # Initializers “customizados” initializer "carrierwave.setup_paths" do CarrierWave.root =? end Rails.root.join(Rails.public_path).to_s end end https://github.com/jnicklas/carrierwave Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  82. 82. INITIALIZERS module MyGem class Railtie < Rails::Railtie # Temos acesso ao objeto app para # obter as configs do usuário. initializer "my_gem.setup" do |app|? # app.config end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  83. 83. FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  84. 84. FRAMEWORK LOADING # Cada módulo avisa através do ActiveSupport # quando é carregado.? ActiveSupport.run_load_hooks( :active_record, ActiveRecord::Base) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  85. 85. FRAMEWORK LOADING # E podemos executar código neste exato # momento, dentro do contexto do que está # sendo carregado. ActiveSupport.on_load(:active_record) do include MyGem::ActiveRecordExtensions end? ActiveSupport.on_load(:action_controller) do include MyGem::ActionControllerExtensions end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  86. 86. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  87. 87. E O QUE EU FAÇO COM ESSE NEGÓCIO DE FRAMEWORK LOADING? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  88. 88. FRAMEWORK LOADING + INITIALIZERS module Devise class Engine < ::Rails::Engine initializer "devise.url_helpers" do ActiveSupport.on_load(:action_controller) do include Devise::Controllers::Helpers? include Devise::Controllers::UrlHelpers end end end end https://github.com/plataformatec/devise Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  89. 89. FRAMEWORK LOADING E você pode criar o seu hook.? ActiveSupport.run_load_hooks(:my_gem, MyGem) ActiveSupport.on_load(:my_gem) do end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  90. 90. COMO EU CRIO UMA RAILS::RAILTIE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  91. 91. RAILS::RAILTIE => COMO? module MyGem class Railtie < ::Rails::Railtie # Acabamos de criar nossa railtie.? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  92. 92. E QUANDO EU REALMENTE PRECISO DE UMA RAILS::RAILTIE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  93. 93. RAILS::RAILTIE => QUANDO? • Precisar carregar generators em outro diretório; • Precisar de rake tasks disponíveis na aplicação; • Precisar executar código ao carregar o console; • Precisar rodar código no momento de inicialização de seu? plugin/gem, como um initializer do Rails; • Precisar extender as funcionalidades de algum dos frameworks; Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  94. 94. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  95. 95. module Responders class Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new config.generators.scaffold_controller = :responders_controller # Add load paths straight to I18n, so engines and application can overwrite it require active_support/i18n I18n.load_path << File.expand_path(../responders/locales/en.yml, __FILE__) initializer "responders.flash_responder" do |app| if app.config.responders.flash_keys? Responders::FlashResponder.flash_keys = app.config.responders.flash_keys end end end end https://github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  96. 96. Rails::Engine? Rails::Railtie + Paths + Autoload Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  97. 97. RAILS::ENGINE app/controllers app/helpers app/mailers app/models app/views config/initializers/*.rb config/routes.rb? config/locales/*.{rb,yml} lib lib/tasks/*.rake Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  98. 98. RAILS::ENGINE Carrega automaticamente controllers, helpers, models, mailers e views dentro do diretório app/.? O arquivo de rotas, initializers e locales são detectados e carregados quando em config/, seguindo a mesma estrutura da aplicação. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  99. 99. RAILS::ENGINE O diretório lib é adicionado ao autoload_path do Rails.? Os arquivos lib/tasks/*.rake são automaticamente carregados, basta seguir esta convenção. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  100. 100. RAILS::ENGINE O que não é carregado automaticamente pela Engine: migrations e assets na pasta public? (javascripts, stylesheets, etc). Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  101. 101. RAILS::ENGINE module MyGem class Engine < ::Rails::Engine # Você pode alterar os load_paths padrão. paths.app.controllers << "lib/controllers"? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  102. 102. COMO EU CRIO UMA RAILS::ENGINE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  103. 103. RAILS::ENGINE => COMO? module MyGem class Engine < ::Rails::Engine # Acabamos de criar nossa engine.? end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  104. 104. E QUANDO EU PRECISO DE UMA RAILS::ENGINE???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  105. 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. 106. EXEMPLO REAL??? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  107. 107. module Devise class Engine < ::Rails::Engine config.devise = Devise # Initialize Warden and copy its configurations. config.app_middleware.use Warden::Manager do |config| Devise.warden_config = config end # Force routes to be loaded if we are doing any eager load. config.before_eager_load { |app| app.reload_routes! } initializer "devise.url_helpers" do Devise.include_helpers(Devise::Controllers) end initializer "devise.omniauth" do |app| Devise.omniauth_configs.each do |provider, config|? app.middleware.use config.strategy_class, *config.args do |strategy| config.strategy = strategy end end if Devise.omniauth_configs.any? Devise.include_helpers(Devise::OmniAuth) end end end end https://github.com/plataformatec/devise Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  108. 108. Rails::Plugin? Rails::Engine + interno ao Rails Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  109. 109. RAILS::PLUGIN Engine com alguns conhecimentos extras para carregar os plugins.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  110. 110. RAILS::PLUGIN Engine com alguns conhecimentos extras para carregar os plugins.? E você ganha de brinde a habilidade do Rails de carregar o arquivo “init.rb” no diretório root do plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  111. 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. 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. 113. COMO EU CRIO UM RAILS::PLUGIN???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  114. 114. RAILS::PLUGIN => COMO? rails plugin install rails server? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  115. 115. E QUANDO EU PRECISO DE UM RAILS::PLUGIN???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  116. 116. RAILS::PLUGIN => QUANDO? Nunca. Lembre-se: é interno ao Rails.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  117. 117. Rails::Application? Rails::Engine + App Bootstrap Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  118. 118. RAILS::APPLICATION Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  119. 119. RAILS::APPLICATION Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.? Inicializa railties, engines e plugins. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  120. 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. 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. 122. RAILS::APPLICATION Highlander!? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  123. 123. RAILS::APPLICATION Highlander!? raise "You cannot have more than one Rails::Application" if Rails.application https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/application.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  124. 124. COMO EU CRIO UMA RAILS::APPLICATION???? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva Sunday, November 6, 11
  125. 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. 126. RESUMO Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  127. 127. SIMPLE_FORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  128. 128. SIMPLE_FORM Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  129. 129. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  130. 130. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  131. 131. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Não é uma Rails::Engine. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  132. 132. SIMPLE_FORM Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Não é uma Rails::Engine. Não é uma Rails::Railtie. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  133. 133. SIMPLE_FORM Nenhum hook é necessário, podemos apenas utilizar a estratégia de framework loading sem precisar de uma Rails::Railtie. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  134. 134. RESPONDERS Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  135. 135. RESPONDERS Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  136. 136. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  137. 137. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  138. 138. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Não é uma Rails::Engine. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  139. 139. RESPONDERS Não é uma Rails::Application. Não é um Rails::Plugin. (a não ser que seja instalado como tal) Não é uma Rails::Engine. É uma Rails::Railtie. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  140. 140. RESPONDERS Permite configuração através do objeto :config; Utiliza alguns hooks de inicialização; Sobrescreve o :scaffold_generator para utilizar o seu próprio. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  141. 141. DEVISE Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  142. 142. DEVISE Não é uma Rails::Application. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  143. 143. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  144. 144. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin. (e NÃO DEVE ser instalado como tal) Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  145. 145. DEVISE Não é uma Rails::Application. Não é um Rails::Plugin. (e NÃO DEVE ser instalado como tal) É uma Rails::Engine e por consequência uma Rails::Railtie. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  146. 146. DEVISE Permite configuração através do objeto :config; Utiliza alguns hooks de inicialização; Adiciona middlewares; Possui funções similares a uma aplicação, com controllers, helpers, mailers, views e rotas, mas não é capaz de rodar isoladamente. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  147. 147. CRIANDO UMA GEM Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  148. 148. BUNDLER Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  149. 149. BUNDLER bundle gem ruby_masters Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  150. 150. BUNDLE GEM Cria a estrutura de diretórios basica da gem. Cria um arquivo Rakefile carregando tarefas do próprio Bundler. Inicializa um repositório git. Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  151. 151. BUNDLE GEM ~/Projects [ree-1.8.7@rubymasters] $ bundle gem ruby_masters create ruby_masters/Gemfile create ruby_masters/Rakefile create ruby_masters/.gitignore create ruby_masters/ruby_masters.gemspec create ruby_masters/lib/ruby_masters.rb create ruby_masters/lib/ruby_masters/version.rb Initializating git repo in ~/Projects/ruby_masters Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  152. 152. BUNDLE GEM Gemfile source "http://rubygems.org" # Specify your gems dependencies in ruby_masters.gemspec gemspec Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  153. 153. BUNDLE GEM Rakefile require bundler Bundler::GemHelper.install_tasks Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  154. 154. BUNDLE GEM ruby_masters.gemspec # -*- encoding: utf-8 -*- $:.push File.expand_path("../lib", __FILE__) require "ruby_masters/version" Gem::Specification.new do |s| s.name = "ruby_masters" s.version = RubyMasters::VERSION s.platform = Gem::Platform::RUBY s.authors = ["TODO: Write your name"] s.email = ["TODO: Write your email address"] s.homepage = "" s.summary = %q{TODO: Write a gem summary} s.description = %q{TODO: Write a gem description} s.rubyforge_project = "ruby_masters" # ... continua end Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  155. 155. BUNDLE GEM lib/ruby_masters.rb module RubyMasters # Your code goes here... end Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  156. 156. BUNDLE GEM lib/ruby_masters/version.rb module RubyMasters VERSION = "0.0.1" end Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  157. 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 @cantoniodasilvaSunday, November 6, 11
  158. 158. RAILTIE? Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  159. 159. BUNDLE GEM + RAILTIE lib/ruby_masters.rb module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = ActiveSupport::OrderedOptions.new # rake_tasks {} # generators {} # console {} # config.to_prepare {} # initializer {} end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  160. 160. BUNDLE GEM + RAILTIE Ou Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  161. 161. BUNDLE GEM + RAILTIE lib/ruby_masters.rb lib/ruby_masters/railtie.rb module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = require "ruby_masters/railtie" ActiveSupport::OrderedOptions.new # rake_tasks {} module RubyMasters # generators {} # Your code goes here... # console {} end # config.to_prepare {} # initializer {} end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  162. 162. BUNDLER <3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  163. 163. RAILS 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilvaSunday, November 6, 11
  164. 164. @cantoniodasilva ?! blog.plataformatec.com.br Obrigado !Sunday, November 6, 11
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×