railties @ ruby mastersconf - 2011.02.26
-
Upload
carlos-antonio-da-silva -
Category
Technology
-
view
485 -
download
1
description
Transcript of railties @ ruby mastersconf - 2011.02.26
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILTIESOU
COMO DESENVOLVER PLUGINS/GEMS PARA RAILS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
$ WHOAMI
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
CARLOS ANTONIO DA SILVA
@cantoniodasilva
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
COMECEI COM DESENVOLVIMENTO EM 2003
E COM RUBY E RAILS EM 2007
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
TRABALHO NA
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
THE ROAD SO FAR
RAILS 2.3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Já possuía a estrutura de Rails Engine.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Já possuía a estrutura de Rails Engine.
Mas...
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Já possuía a estrutura de Rails Engine.
Mas... podemos dizer que era uma boa “gambiarra”.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-traveling-for-kludgers.jpg
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
module Rails class Plugin
# Engines are plugins with an app/ directory. def engine? has_app_directory? end private
def has_app_directory? File.directory?(File.join(directory, 'app')) end endend
https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Diretórios como app/[models|controllers|helpers] e as rotas eram automaticamente carregados.
Mas eram fixos, não existia a possibilidade de nenhuma configuração de paths.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3module Rails class Plugin
def view_path File.join(directory, 'app', 'views') end
def controller_path File.join(directory, 'app', 'controllers') end
def routing_file File.join(directory, 'config', 'routes.rb') end
private def app_paths [ File.join(directory, 'app', 'models'), File.join(directory, 'app', 'helpers'), controller_path, metal_path ] end endend
https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper...
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Tínhamos ORMs diferentes “integradas” ao Rails, como o Datamapper e o MongoMapper...
Que poderiam quebrar a cada novo patch release do Rails.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Não existia uma API pública definida para outros frameworks se integrarem.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Não existia uma API pública definida para outros frameworks se integrarem.
A solução: alias method chain / monkey patch.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
http://thereifixedit.files.wordpress.com/2011/02/white-trash-repairs-you-spoiled-your-sweet-ride.jpg
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
O Rails sabia da existência do ActiveRecord...
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
O Rails sabia da existência do ActiveRecord...
Pois era ele o responsável por inicializar o ActiveRecord e os demais frameworks.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Isso quer dizer que, por mais que você estivesse utilizando o DataMapper ou MongoMapper, por
exemplo, o ActiveRecord sempre estaria lá.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3module Rails class Initializer # Requires all frameworks specified by the Configuration#frameworks # list. By default, all frameworks (Active Record, Active Support, # Action Pack, Action Mailer, and Active Resource) are loaded. def require_frameworks configuration.frameworks.each { |framework| require(framework.to_s) } end
def load_observers if gems_dependencies_loaded && configuration.frameworks.include?(:active_record) ActiveRecord::Base.instantiate_observers end end
def initialize_database if configuration.frameworks.include?(:active_record) ActiveRecord::Base.configurations = configuration.database_configuration ActiveRecord::Base.establish_connection end end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
module Rails class Configuration
private
def default_frameworks [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] end
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SINGLERESPONSIBILITY
PRINCIPLE
RAILS 2.3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SINGLERESPONSIBILITY
PRINCIPLE
RAILS 2.3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 2.3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
NOW
RAILS 3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
Modularidade.
API pública e bem definida.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
HOOKS!
http://www.flickr.com/photos/ooh_food/3304708302/
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
O Rails não conhece o ActiveRecord.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
O Rails não conhece o ActiveRecord.
O ActiveRecord é quem conta para o Rails como ele deve ser inicializado.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
E isso acontece com todos os outros frameworks.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
E isso acontece com todos os outros frameworks.
ActiveRecord
ActionMailer
ActionController
ActionView
ActiveResource
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
E isso acontece com todas as demais gems/plugins que se integram com o Rails.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
E isso acontece com todas as demais gems/plugins que se integram com o Rails.
DataMapper
Devise
RSpec
Mongoid
outros...
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
EXEMPLO REAL???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
module ActiveRecord class Railtie < Rails::Railtie config.active_record = ActiveSupport::OrderedOptions.new
config.generators.orm :active_record, :migration => true, :timestamps => true
config.app_middleware.insert_after "::ActionDispatch::Callbacks", "ActiveRecord::QueryCache"
rake_tasks do load "active_record/railties/databases.rake" end
console do ActiveRecord::Base end
initializer "active_record.logger" do ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger } end
config.after_initialize do ActiveSupport.on_load(:active_record) do instantiate_observers # .... end end endend
https://github.com/rails/rails/tree/3-0-stable/activerecord
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SINGLERESPONSIBILITY
PRINCIPLE
RAILS 3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
WIN!!!http://www.flickr.com/photos/simoncopping/5050597808/
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
Railties
WTF???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
Railties
WTF???WTF???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Engine
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Application Engine
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Application
Initialization
Engine
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Application
Initialization
Engine
Generators
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RailtiesWTF???
Application
Initialization
Engine
Generators
HOOKSSunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???CONFIGURAÇÃO
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
CONFIGURAÇÃO
https://github.com/plataformatec/responders
module Responders class Railtie < ::Rails::Railtie
config.responders = ActiveSupport::OrderedOptions.new
# Na configuração da app (application.rb): # config.responders.flash_keys = [:notice, :failure] endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???GENERATORS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
module MyGem class Railtie < ::Rails::Railtie
generators do require "my_gem/generator" end
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
Preciso realmente adicionar na Railtie?
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
Preciso realmente adicionar na Railtie?
Não, se você seguir a convenção.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
https://github.com/plataformatec/simple_form
simple_form lib generators simple_form install_generator.rb templates simple_form.rb
rails generate simple_form:install
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
https://github.com/plataformatec/simple_form
simple_form lib generators simple_form install_generator.rb templates simple_form.rb
Namespace
Generator
rails generate simple_form:install
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
http://guides.rubyonrails.org/generators.html
module SimpleForm module Generators class InstallGenerator < Rails::Generators::Base desc "Copy SimpleForm default files" source_root File.expand_path('../templates', __FILE__)
def copy_initializers copy_file 'simple_form.rb', 'config/initializers/simple_form.rb' end end endend
rails generate simple_form:install
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
Siga as convenções.
http://www.flickr.com/photos/jasonteale/1340004498/
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS
Siga as convenções.
E você será mais feliz =).
http://www.flickr.com/photos/jasonteale/1340004498/
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???GENERATORS - HOOKS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS - ORM
https://github.com/mongoid/mongoid
module Rails module Mongoid class Railtie < Rails::Railtie
config.generators.orm :mongoid, :migration => false
end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS - TEST FRAMEWORK
https://github.com/rspec/rspec-rails
module Rails module RSpec class Railtie < Rails::Railtie
config.generators.test_framework :rspec
end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS - TEMPLATE ENGINE
https://github.com/nex3/haml
module Rails module Haml class Railtie < Rails::Railtie
config.generators.template_engine :haml
end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
GENERATORS - MAIS OPÇÕES?
https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/generators.rb
:helper => true,:orm => nil,:integration_tool => nil,:performance_tool => nil,:resource_controller => :controller,:scaffold_controller => :scaffold_controller,:stylesheets => true,:test_framework => nil,:template_engine => :erb
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???RAKE TASKS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAKE TASKS
module Rails module RSpec class Railtie < Rails::Railtie
rake_tasks do load "rspec/rails/tasks/rspec.rake" end
end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???CONSOLE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
CONSOLE
module ActiveRecord class Railtie < Rails::Railtie
# Forçar o carregamento do # ActiveRecord com o console. console do ActiveRecord::Base end endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
http://www.flickr.com/photos/mattbrett/224471090/
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
module MyGem class Railtie < Rails::Railtie
config.before_configuration { # Roda após criar a classe da Aplicação, mas # antes de rodar as configurações do usuário. }
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
module MyGem class Railtie < Rails::Railtie
config.before_initialize { # Roda depois da configuração do usuário, mas # antes dos initializers. }
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
module MyGem class Railtie < Rails::Railtie
config.to_prepare { # Roda antes de cada request em development, e # antes da primeira request em production. }
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
module MyGem class Railtie < Rails::Railtie
config.before_eager_load { # Roda antes do Rails carregar todo o código # da aplicação. Isso só acontece com a opção # :cache_classes habilitada (production). }
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZATION HOOKS
module MyGem class Railtie < Rails::Railtie
config.after_initialize { # Roda após a inicialização do Rails, # configurações do usuário e initializers, e o # próprio bloco to_prepare. É executado apenas # uma única vez, antes da primeira requisição. }
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Development
before_configuration=> Booting WEBrickbefore_initializeto_prepareafter_initialize[...] INFO WEBrick 1.3.1
to_prepareRequest...to_prepareRequest...to_prepare
Production (cache_classes)
before_configuration=> Booting WEBrickbefore_initializeto_preparebefore_eager_loadafter_initialize[...] INFO WEBrick 1.3.1
Request...Request...
INITIALIZATION HOOKS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Development
before_configuration=> Booting WEBrickbefore_initializeto_prepareafter_initialize[...] INFO WEBrick 1.3.1
to_prepareRequest...to_prepareRequest...to_prepare
Production (cache_classes)
before_configuration=> Booting WEBrickbefore_initializeto_preparebefore_eager_loadafter_initialize[...] INFO WEBrick 1.3.1
Request...Request...
INITIALIZATION HOOKS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???INITIALIZERS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZERS
module CarrierWave class Railtie < Rails::Railtie
# Initializers “customizados” initializer "carrierwave.setup_paths" do CarrierWave.root = Rails.root.join(Rails.public_path).to_s end
endend
https://github.com/jnicklas/carrierwave
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
INITIALIZERS
module MyGem class Railtie < Rails::Railtie
# Temos acesso ao objeto app para # obter as configs do usuário. initializer "my_gem.setup" do |app| # app.config end
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???FRAMEWORK LOADING
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
FRAMEWORK LOADING
# Cada módulo avisa através do ActiveSupport# quando é carregado.
ActiveSupport.run_load_hooks( :active_record, ActiveRecord::Base)
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
FRAMEWORK LOADING
# E podemos executar código neste exato# momento, dentro do contexto do que está# sendo carregado.
ActiveSupport.on_load(:active_record) do include MyGem::ActiveRecordExtensionsend
ActiveSupport.on_load(:action_controller) do include MyGem::ActionControllerExtensionsend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
E O QUE EU FAÇO COM ESSE NEGÓCIO DE
FRAMEWORK LOADING?
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
E O QUE EU FAÇO COM ESSE NEGÓCIO DE
FRAMEWORK LOADING?
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
FRAMEWORK LOADING + INITIALIZERS
module Devise class Engine < ::Rails::Engine
initializer "devise.url_helpers" do ActiveSupport.on_load(:action_controller) do include Devise::Controllers::Helpers include Devise::Controllers::UrlHelpers end end
endend
https://github.com/plataformatec/devise
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
FRAMEWORK LOADING
E você pode criar o seu hook.
ActiveSupport.run_load_hooks(:my_gem, MyGem)
ActiveSupport.on_load(:my_gem) do end
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???COMO EU CRIO UMA
RAILS::RAILTIE???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::RAILTIE => COMO?
module MyGem class Railtie < ::Rails::Railtie # Acabamos de criar nossa railtie.
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???E QUANDO EU REALMENTE
PRECISO DE UMA RAILS::RAILTIE???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::RAILTIE => QUANDO?
• Precisar carregar generators em outro diretório;
• Precisar de rake tasks disponíveis na aplicação;• Precisar executar código ao carregar o console;
• Precisar rodar código no momento de inicialização de seu plugin/gem, como um initializer do Rails;
• Precisar extender as funcionalidades de algum dos frameworks;
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
EXEMPLO REAL???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
module Responders class Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new config.generators.scaffold_controller = :responders_controller
# Add load paths straight to I18n, so engines and application can overwrite it require 'active_support/i18n' I18n.load_path << File.expand_path('../responders/locales/en.yml', __FILE__)
initializer "responders.flash_responder" do |app| if app.config.responders.flash_keys Responders::FlashResponder.flash_keys = app.config.responders.flash_keys end end endend
https://github.com/plataformatec/responders
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
Rails::EngineWTF???
Rails::Railtie + Paths + Autoload
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
app/controllersapp/helpersapp/mailersapp/modelsapp/viewsconfig/initializers/*.rbconfig/routes.rbconfig/locales/*.{rb,yml}liblib/tasks/*.rake
RAILS::ENGINE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Carrega automaticamente controllers, helpers, models, mailers e views dentro do
diretório app/.
O arquivo de rotas, initializers e locales são detectados e carregados quando em config/, seguindo a mesma estrutura da aplicação.
RAILS::ENGINE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
O diretório lib é adicionado ao autoload_path do Rails.
Os arquivos lib/tasks/*.rake são automaticamente carregados, basta
seguir esta convenção.
RAILS::ENGINE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
O que não é carregado automaticamente pela Engine:
migrations e assets na pasta public (javascripts, stylesheets, etc).
RAILS::ENGINE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::ENGINE
module MyGem class Engine < ::Rails::Engine
# Você pode alterar os load_paths padrão. paths.app.controllers << "lib/controllers"
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???COMO EU CRIO UMA
RAILS::ENGINE???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::ENGINE => COMO?
module MyGem class Engine < ::Rails::Engine # Acabamos de criar nossa engine.
endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???E QUANDO EU PRECISO DE UMA
RAILS::ENGINE???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::ENGINE => QUANDO?
• Suas extensões precisarem de: rotas, controllers, views ou mailers, por exemplo.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
EXEMPLO REAL???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
module Devise class Engine < ::Rails::Engine config.devise = Devise
# Initialize Warden and copy its configurations. config.app_middleware.use Warden::Manager do |config| Devise.warden_config = config end
# Force routes to be loaded if we are doing any eager load. config.before_eager_load { |app| app.reload_routes! }
initializer "devise.url_helpers" do Devise.include_helpers(Devise::Controllers) end
initializer "devise.omniauth" do |app| Devise.omniauth_configs.each do |provider, config| app.middleware.use config.strategy_class, *config.args do |strategy| config.strategy = strategy end end
if Devise.omniauth_configs.any? Devise.include_helpers(Devise::OmniAuth) end end endend
https://github.com/plataformatec/devise
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
Rails::PluginWTF???
Rails::Engine + interno ao Rails
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Engine com alguns conhecimentos extras para carregar os plugins.
RAILS::PLUGIN
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Engine com alguns conhecimentos extras para carregar os plugins.
E você ganha de brinde a habilidade do Rails de carregar o arquivo
“init.rb” no diretório root do plugin.
RAILS::PLUGIN
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::PLUGIN
Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::PLUGIN
Cada plugin em vendor/plugins é carregado pelo Rails como um Rails::Plugin.
Isto quer dizer que não é possível colocar uma Engine dentro de vendor/plugins, porque
os arquivos seriam carregados duas vezes.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???COMO EU CRIO UM
RAILS::PLUGIN???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::PLUGIN => COMO?
rails plugin installrails server
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???E QUANDO EU PRECISO DE UM
RAILS::PLUGIN???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::PLUGIN => QUANDO?
Nunca. Lembre-se: é interno ao Rails.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
Rails::ApplicationWTF???
Rails::Engine + App Bootstrap
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.
RAILS::APPLICATION
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Engine com super powers e a responsabilidade de coordenar o processo de inicialização da app.
Inicializa railties, engines e plugins.
RAILS::APPLICATION
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Possui as configurações relativas a aplicação, como o “cache_classes”.
RAILS::APPLICATION
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Possui as configurações relativas a aplicação, como o “cache_classes”.
Carrega e recarrega as rotas quando necessário, e constrói a estrutura de
middlewares da aplicação.
RAILS::APPLICATION
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Highlander!
RAILS::APPLICATION
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
Highlander!
RAILS::APPLICATION
raise "You cannot have more than one Rails::Application" if Rails.application
https://github.com/rails/rails/blob/3-0-stable/railties/lib/rails/application.rb
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???COMO EU CRIO UMA RAILS::APPLICATION???
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
WTF???
RAILS::APPLICATION => COMO?
rails new my_appcd my_apprails server
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESUMO
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Não é uma Rails::Application.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Não é uma Rails::Application.Não é um Rails::Plugin.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Não é uma Rails::Engine.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Não é uma Rails::Engine.Não é uma Rails::Railtie.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
SIMPLE_FORM
Nenhum hook é necessário, podemos apenas utilizar a
estratégia de framework loading sem precisar de uma Rails::Railtie.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Não é uma Rails::Application.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Não é uma Rails::Application.Não é um Rails::Plugin.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Não é uma Rails::Engine.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Não é uma Rails::Application.Não é um Rails::Plugin.
(a não ser que seja instalado como tal)
Não é uma Rails::Engine.É uma Rails::Railtie.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RESPONDERS
Permite configuração através do objeto :config;Utiliza alguns hooks de inicialização;
Sobrescreve o :scaffold_generator para utilizar o seu próprio.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Não é uma Rails::Application.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Não é uma Rails::Application.Não é um Rails::Plugin.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Não é uma Rails::Application.Não é um Rails::Plugin.
(e NÃO DEVE ser instalado como tal)
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Não é uma Rails::Application.Não é um Rails::Plugin.
(e NÃO DEVE ser instalado como tal)
É uma Rails::Engine e por consequência uma Rails::Railtie.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
DEVISE
Permite configuração através do objeto :config;Utiliza alguns hooks de inicialização;
Adiciona middlewares;Possui funções similares a uma aplicação, com
controllers, helpers, mailers, views e rotas, mas não é capaz de rodar isoladamente.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
CRIANDO UMA GEM
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLER
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLER
bundle gem ruby_masters
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
Cria a estrutura de diretórios basica da gem.
Cria um arquivo Rakefile carregando tarefas do próprio Bundler.
Inicializa um repositório git.
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
~/Projects [ree-1.8.7@rubymasters] $ bundle gem ruby_masters create ruby_masters/Gemfile create ruby_masters/Rakefile create ruby_masters/.gitignore create ruby_masters/ruby_masters.gemspec create ruby_masters/lib/ruby_masters.rb create ruby_masters/lib/ruby_masters/version.rbInitializating git repo in ~/Projects/ruby_masters
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
Gemfile
source "http://rubygems.org"
# Specify your gem's dependencies in ruby_masters.gemspecgemspec
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
Rakefile
require 'bundler'Bundler::GemHelper.install_tasks
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
# -*- encoding: utf-8 -*-$:.push File.expand_path("../lib", __FILE__)require "ruby_masters/version"
Gem::Specification.new do |s| s.name = "ruby_masters" s.version = RubyMasters::VERSION s.platform = Gem::Platform::RUBY s.authors = ["TODO: Write your name"] s.email = ["TODO: Write your email address"] s.homepage = "" s.summary = %q{TODO: Write a gem summary} s.description = %q{TODO: Write a gem description}
s.rubyforge_project = "ruby_masters" # ... continuaend
ruby_masters.gemspec
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
lib/ruby_masters.rb
module RubyMasters # Your code goes here...end
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
lib/ruby_masters/version.rb
module RubyMasters VERSION = "0.0.1"end
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM
rake tasks
~/Projects/ruby_masters [ree-1.8.7@rubymasters] $ rake -Trake build # Build ruby_masters-0.0.1.gem into the pkg directoryrake install # Build and install ruby_masters-0.0.1.gem into system gemsrake release # Create tag v0.0.1 and build and push ruby_masters-0.0.1.gem to Rubygems
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILTIE?
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM + RAILTIE
lib/ruby_masters.rb
module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = ActiveSupport::OrderedOptions.new # rake_tasks {} # generators {} # console {} # config.to_prepare {} # initializer {} endend
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM + RAILTIE
Ou
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLE GEM + RAILTIE
lib/ruby_masters/railtie.rb
module RubyMasters class Railtie < Rails::Railtie # config.ruby_masters = ActiveSupport::OrderedOptions.new # rake_tasks {} # generators {} # console {} # config.to_prepare {} # initializer {} endend
lib/ruby_masters.rb
require "ruby_masters/railtie"
module RubyMasters # Your code goes here...end
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
BUNDLER <3
Sunday, November 6, 11
Carlos Antonio @cantoniodasilvablog.plataformatec.com.br
RAILS 3
Sunday, November 6, 11
@cantoniodasilva
blog.plataformatec.com.br
Obrigado!
?!
Sunday, November 6, 11