2012-08-30 8 views
11

Attualmente sto sperimentando lo spostamento delle funzionalità nei motori. Funziona bene finora, ma sono un po 'confuso perché certe parti del motore vengono sempre ricaricate automaticamente quando qualcosa cambia, e altre no.Rails: solo gli helper vengono ricaricati quando si riavvia il server

In particolare, quando si aggiunge un metodo di supporto, devo riavviare il server Rails, altrimenti non viene visualizzato da Rails. Questo comportamento normale? Ecco la parte rilevante del mio motore:

componenti/iq_list.rb

# encoding: utf-8 
require 'iq_list/engine' 

# Load IqList Modules 
module IqList 
    extend ActiveSupport::Autoload 
    autoload :Helpers 
    autoload :Models 
    autoload :Controllers 
end 

componenti/iq_list/engine.rb

module IqList 
    class Engine < ::Rails::Engine 
    end 
end 

componenti/iq_list/helpers.rb

module IqList 
    module Helpers 
    extend ActiveSupport::Autoload 
    autoload :IqListHelper 
    end 
end 

componenti/iq_list/helpers/iq_list_helper.rb

module IqList 
    module Helpers 
    module IqListHelper 
     def some_method 
     # ... 
     end 
    end 
    end 
end 

Sono ancora molto nuovo per i motori, e molto del codice sopra ho preso dal lavoro di qualcun altro, quindi per favore sii paziente con me. Ogni suggerimento nella giusta direzione è molto apprezzato.

+1

http://stackoverflow.com/questions/4713066/how-can-i-force-my-plugin- per ricaricare con ogni richiesta – apneadiving

+0

Perché il codice è sotto una directory 'components'? Cosa ti sta facendo fare questo? I componenti sono una caratteristica antica di Rails (1.2). –

+0

Dove lo posizioneresti? Come ho detto, ho preso il codice da qualcun altro, e penso che sia dovuto al fatto che all'interno della componente 'app/components' viene ricaricato correttamente. Dove metteresti un motore che stai sviluppando pesantemente? –

risposta

1

Sembra che potresti aver abbaiare l'albero sbagliato con i motori. Se stai cercando di ottenere semplicemente la separazione delle preoccupazioni, probabilmente vorrai semplicemente creare alcune semplici classi di rubini e incollarle in lib/ (in modo organizzato, ovviamente).

Un motore sarebbe stato sviluppato separatamente dal progetto "attuale" probabilmente portato attraverso una gemma. Le modifiche alle gemme incluse richiederebbero il riavvio del server AFAIK.

1

Se avete bisogno di codice dal tuo motore ricaricato su ogni richiesta è necessario inserire nel blocco to_prepare del codice motori intialization

module IqList 
    class Engine < ::Rails::Engine 
    config.to_prepare do 
    ApplicationController.helper(IqListHelper) 
    end 
    end 
end 

codice nel blocco to_prepare è garantito per funzionare, una volta in produzione e ogni tempo di sviluppo.

vedere le rotaie guide così come What does this Rails Engine code mean: config.to_prepare &method(:activate).to_proc

e

http://robots.thoughtbot.com/tips-for-writing-your-own-rails-engine

+0

Se si utilizza la notazione del modulo e il proprio Engine ha il proprio ApplicationController, si dovrebbe usare ':: ApplicationController .helper (IqListHelper) 'invece. –