# 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 Sunday, November 6, 11
# 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 Sunday, November 6, 11
private def default_frameworks [ :active_record, :action_controller, :action_view, :action_mailer, :active_resource ] end end end Sunday, November 6, 11
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 Sunday, November 6, 11
Railtie < ::Rails::Railtie config.responders = ActiveSupport::OrderedOptions.new # Na configuração da app (application.rb): # config.responders.flash_keys = [:notice, :failure] end end Sunday, November 6, 11
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 Sunday, November 6, 11
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 Sunday, November 6, 11
Railtie < Rails::Railtie config.before_initialize { # Roda depois da configuração do usuário, mas # antes dos initializers. } end end Sunday, November 6, 11
Railtie < Rails::Railtie config.to_prepare { # Roda antes de cada request em development, e # antes da primeira request em production. } end end Sunday, November 6, 11
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 Sunday, November 6, 11
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 Sunday, November 6, 11
< Rails::Railtie # Initializers “customizados” initializer "carrierwave.setup_paths" do CarrierWave.root = Rails.root.join(Rails.public_path).to_s end end end https://github.com/jnicklas/carrierwave Sunday, November 6, 11
< 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 Sunday, November 6, 11
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 Sunday, November 6, 11
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 Sunday, November 6, 11
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
::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 Sunday, November 6, 11
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
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
::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 Sunday, November 6, 11
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
é 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
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
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
: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
$ 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 Sunday, November 6, 11