rails official novedades new features ruby-on-rails ruby-on-rails-3 plugins ruby-on-rails-plugins reload

ruby-on-rails - novedades - ruby on rails official website



¿Cómo puedo forzar mi complemento para que se cargue con cada solicitud? (6)

Con https://github.com/ranmocy/guard-rails , es muy fácil:

# Gemfile.local gem ''guard-rails'' $ bundle $ guard init rails # Guardfile: guard ''rails'' do watch(''Gemfile.lock'') watch(%r{^(config|plugins)/.*}) end $ bundle exec guard

Según tengo entendido, los complementos no se vuelven a cargar en Rails con cada solicitud en modo de desarrollo. Lo que tiene sentido, ya que generalmente agregas complementos a tu aplicación y es la aplicación que estás desarrollando.

Pero si está desarrollando un complemento, debe reiniciar el servidor con cada cambio en el complemento que tiene una sobrecarga significativa.

¿Hay alguna forma de hacer que Rails vuelva a cargar su complemento durante el desarrollo, la forma en que vuelve a cargar sus modelos y controladores?


De manera sencilla, desarrolle su complemento en una carpeta dentro de la carpeta "app" :

  • aplicación
    • modelos
    • controladores
    • ayudantes
    • puntos de vista
    • tu_plugin_aquí

De esta manera, todas sus clases de complementos se volverán a cargar en cada solicitud.

Otra posibilidad es agregar la ruta en el archivo application.rb:

require File.expand_path(''../boot'', __FILE__) require ''rails/all'' Bundler.require(:default, Rails.env) if defined?(Bundler) module SunspotTutorial class Application < Rails::Application config.autoload_paths += %W{ #{config.root}/plugins/your_plugin_name/lib } #lots of other code end end

De esta manera tu plugin será recargado todo el tiempo.


Esta solución, para motores, funciona en Rails 2.3 pero viene con un cavaet, cargará todos los archivos en el motor y la aplicación principal en cada solicitud, lo que hará que los tiempos de respuesta sean más lentos.

# lib/my_engine/engine.rb if ENV[''RELOAD_MYENGINE''] && Rails.env.development? config.to_prepare do Rails.logger.debug "RELOADING MY ENGINE" require_dependency MyEngine::Engine.root.join(''lib'', ''my_engine'').to_s end config.after_initialize do Rails.application.config.reload_classes_only_on_change = false end

A continuación, inicie el servidor:

RELOAD_MYENGINE=1 rails server


Hago esto usando la gema escopeta.

gem install shotgun

cd /path/to/rails/app

shotgun

tiempo de respuesta más lento, pero recargando todos los códigos de rieles, sin perder tiempo para escribir autoload_paths


También he estado luchando con esto por algún tiempo. Ninguna de las soluciones funciona, incluidos los trucos autoload_paths y autoload_once_paths . Además, el truco con FileUpdateChecker y los inicializadores tampoco ayuda (el verificador se activa correctamente, pero los archivos no se vuelven a cargar). Lo mismo para config.reload_plugins = true ...

Sin embargo, hay una solución. En app/controllers/application_controller.rb agregue una línea: require_dependency ''your_file_name_here'' El controlador de la aplicación se require_dependency ''your_file_name_here'' cargar en cada solicitud y require_dependency hace que su archivo se revise en busca de modificaciones y se recargue en consecuencia. Funcionó para mí, Apache 2, Passenger 3 y Rails 3.0.3.


Si reiniciar el servidor automáticamente cuando se modifica el código del complemento es una solución aceptable, puede usar el rstakeout de Mike Clark / rstakeout para eso, o la nueva watchr que parece que hace lo mismo.

Harías algo como esto:

rstakeout ''touch tmp/restart.txt'' ''vendor/plugins/**/*''