2011-10-11 16 views
6

Questo è di più per la sperimentazione - ma volevo la funzionalità di namespacing nell'app per evitare conflittirails 3.1.1 - con motori montabili, è possibile accedere agli asset delle app genitore, layout di default?

L'idea è di avere un'app principale - che gestisce l'autenticazione, oggetti comuni, schermi di amministrazione ecc quindi la creazione di motori di aggiungere ulteriori funzionalità come

  • crm
  • cms
  • blog
  • wiki
  • forum
  • ecc

Questi motori che possono scegliere come ho bisogno per qualsiasi tipo di applicazione che sto costruendo. È possibile?

È solo il caso di applicare entrambe le opzioni --mountable e --full?

sperimentando - Ci sarebbe qualche problema se si utilizza l'opzione completa aggiungere RSpec e poi aggiungo semplice

rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy 

e in lib \ PLUGIN_NAME \ engine.rb

module PluginName 
    class Engine < Rails::Engine 

    # this is added by rails when an engine is mountable 
    # to isolate the plugin and prevent name clashes 
    isolate_namespace PluginName 

    # one of the additions to make rspec work from command line for the plugin 
    config.generators do |g| 
     g.test_framework :rspec, :view_specs => false 
    end 
    end 
end 

ho già creato entrambi i motori --full e --mountable e hanno rspec finalmente funzionante per chiunque stia leggendo ci sono degli ottimi articoli (vedi sotto), ma mi chiedo dell'impatto più ampio di fare questo per la soluzione che sto cercando di creare

Sto ancora giocando con questo e posterò i miei risultati ..
Qualsiasi aiuto/discussione sarà enormemente apprezzato.

Nota Bene

  1. Perché voglio farlo - Costruire una volta usare molte volte ...
  2. non vorrei mai un non-tech/cliente per aggiungere "plugins/motori" - questo è puramente per intrattenere punto 1.

problemi che sto avendo ...

  1. Esecuzione del server nell'app di livello superiore. Solo quando accedo al contenuto dal motore, (posso vedere dai messaggi di errore) ho un problema di routing (root_path indefinito o devise route mancanti) - il rendering del layout dell'applicazione madre, posso vederlo nell'origine estratta dell'errore . Progresso ma nessun sigaro ancora!

Riferimenti utili

+0

mi manca qualcosa in maniera massiccia ovvio qui ... se copio i percorsi dal padre per i percorsi motori tutto funziona bene per montabile ... fare lo stesso per --full come specificato sopra percorsi non funzionano – Spasm

risposta

2

sono riuscito a ottenere questo lavoro con le seguenti operazioni:

  1. Nella mia app genitore mi montava il motore in routes.rb

    mount PluginName::Engine => '/plugin_name' 
    

    ho appena rimosso.

  2. Creato un controller di applicazione come indicato da Ryan Bigg in basso.

    class PluginName::ApplicationController < ApplicationController 
        ... 
    end 
    
  3. Come ho voluto avere nome cose distanziati quando la generazione di controller, i modelli, i test in modo da avere per commentare essenzialmente il isolate_namespace PluginName lib \ PLUGIN_NAME \ engine.rb quando volevo la gemma per essere eseguito nel genitore app.

    Non è ancora una soluzione ideale. dalla parte superiore della mia testa, potrei usare qualcosa come:

    isolate_namespace PluginName if %w[development testing].include?(Rails.env) 
    

    ma dovrà verificare se questo è pratico.

Complimenti a Ryan per avermi aiutato a trovare la mia strada molte grazie

Inoltre, lo stesso può essere fatto con la versione interruttore --mountable e tutto quello che dovete fare è un ulteriore passo nella tua motori config /itinerari.rb sostituire

PluginName::Engine.routes.draw do 

con

Rails.application.routes.draw do 
+0

Mi ha salvato il culo con questo. Grazie. – codykrieger

1

Sì, è possibile refe Renče le attività di applicazione genitore solo da loro riferimento nella vostra applicazione, come normale:

<%= stylesheet_link_tag "application %> 

Anche se, non so perché si vorrebbe farlo perché ...

ho intenzione di rispondere alla tua prima domanda con la risposta alla tua seconda domanda.

Per utilizzare il layout dell'applicazione è necessario modificare ApplicationController nel motore (che è namespace) e ereditarlo da ApplicationController nel motore.

Che avrà quindi i controller per il motore utilizzando il layout fornito dal motore. Sono doing this in my engine, forem.

Un giorno, questo sarà coperto in the Engines Guide che, in questo momento di scrittura, è attualmente in fase di scrittura.

+0

Grazie per il ritorno a me ho letto un bel po 'dei tuoi post sparsi sul web. L'accesso agli asset parent sarebbe solo il layout, ma nel mio primo tentativo di utilizzo di mountable questo non era possibile in quanto sono completamente autonomi. Questo è il motivo per cui ho pensato di utilizzare l'opzione completa ma ancora la spaziatura del nome, quindi ereditando l'applicazione genitore ma distanziata l'app dal nome. Ti sei chiesto quali sarebbero state le ripercussioni .. stai cercando di raccogliere informazioni. – Spasm

Problemi correlati