2014-06-16 11 views
5

Ho creato una gemma semplice per Ruby on Rails; l'idea è che fornisce codice/viste per azioni comuni (index/show/etc.) che uso in molte delle mie applicazioni. Mi piacerebbe "ASCIUGARLA" in una gemma.Rendering di una vista dal mio Ruby on Rails Gem

La creazione di Concern è avvenuta senza problemi, tuttavia, non riesco a sembrare di riuscire a visualizzare una visualizzazione nella mia applicazione.

Ad esempio, nel mio lib/rails_default_actions/rails_default_actions.rb che faccio:

module RailsDefaultActions 
    module DefaultActions 
    extend ActiveSupport::Concern 
     respond_to do |format| 
     format.html { render 'default/index' } 
     end 
    end 
    end 
end 

Ma viene generato un errore:

Missing template default/index with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :haml]}. Searched in: 
    * "/home/martin/myapp/app/views" 
    * "/home/martin/myapp/vendor/bundle/ruby/2.1.0/gems/devise-3.2.4/app/views" 
    * "/home/martin/myapp" 

alla fine ho sorta di riuscito a incidere il mio modo per aggirare questo errore, ma si sente molto kludgey e non funziona in alcuni scenari. Qual è il modo corretto di includere le visualizzazioni in una gemma?

Ho cercato di creare un motore, ma mi sembra eccessivo, dal momento che ho solo una preoccupazione e alcuni punti di vista.

+0

La vista che stai tentando di eseguire il rendering nell'app o nella gemma? – eduardo

+0

@eduardo Non importa, ma questo è nella gemma. – Carpetsmoker

+0

Quando Rails segnala l'errore, mostra i percorsi in cui si sta cercando la vista. Mi sembra che la tua vista non si trovi nel percorso di caricamento. Potrebbe essere possibile? – eduardo

risposta

4

Il modo "corretto" per eseguire questa operazione poiché Rails 3 è creare un Engine; c'è anche a Rails guide per questo, ma la creazione di un motore di base è facile come:

module MyGemName 
    class Engine < Rails::Engine 
    end 
end 

Quando Rails sembra per una vista da rendere, cercherà prima nella app/views directory dell'applicazione. Se non è in grado di trovare la vista lì, controllerà le directory app/views di tutti i motori che hanno questa directory.