2009-03-11 5 views

risposta

8

Grazie per le risposte. Mike Woodhouse, eri così vicino. Risulta, tutto quello che dovete fare per accedere al appname da dentro il modello rotaie è ...

@root.split('/').last 

La variabile @root è la prima cosa creata durante l'inizializzazione di modelli ed è disponibile all'interno del vostro rotaie modelli. RAILS_ROOT non funziona.

1

RAILS_ROOT fornisce il percorso assoluto per la directory principale. Il nome della tua app sarà la parte della stringa dopo l'ultimo '/' che puoi afferrare in vari modi.

EDIT: Non abbastanza per portare a termine il lavoro. Mike e Dan lo stendono sotto.

3

C'è probabilmente un modo più semplice, ma questo sembra funzionare:

RAILS_ROOT.split('/').last 

EDIT: Bleah - questo ha bocciato una volta, e l'elettore era giusto. Se avessi letto la domanda con più attenzione, avrei notato gli elementi 2.3 e template.rb. Scuse.

Sospetto che RAILS_ROOT non sia stato creato nel punto in cui è necessario il nome dell'app. Guardando ruby\lib\ruby\gems\1.8\gems\rails-2.2.2\bin\rails, tuttavia, quasi la prima cosa che succede è questo:

app_path = ARGV.first 

E 'usato alla fine dello script per consentire a un chdir e congelare per essere fatto se necessario - non sapevo che potrei insta -la brezza alla creazione, così ho imparato qualcosa di nuovo almeno. ARGV poi viene utilizzato qui:

Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'app') 

che ci porta rapidamente al luogo dove ARGV è realmente gestita:

rails-2.3.1\lib\rails_generator\scripts.rb 

dove vedo

Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke! 

Da qualche parte in basso qui è probabilmente dove il il modello viene gestito. Temo di essere in una fase molto iniziale con 2.3 e il template è un'area che non ho ancora visto.

Questo aiuta meglio del mio primo tentativo?

0

Credo che il modo migliore ora sia chiamare Rails.root e non più RAILS_ROOT. Apparentemente qualcuno su un binario del pianeta ha un'avversione verso le maiuscole o qualcosa di simile. A partire dal 2.3.5 entrambi sembrano funzionare.

15

stavo cercando una risposta a questa domanda. sfortunatamente la risposta sopra (@root) non sembra funzionare in Rails 3.

Ecco le variabili si può accedere in Rails 3 modelli di app (ancora più facile):

@app_name 
@app_path 
0

mi stavo errore

`template': undefined local variable or method `app_name' 

rubino 1.9.2p290, Rails 3.2.11, thor 0.18.0, Windows

ma con rotaie 2.3 generatore:

class DynanavGenerator < Rails::Generators::Base 

(posso Si assicuri che questo errore si sia verificato sotto rails 3.0.9 o precedente) la definizione di classe modificata sia:

class DynanavGenerator < Rails::Generators::NamedBase 

che poi ha dato:

fornito alcun valore per gli argomenti richiesti 'nome'

Ho poi aggiunto un 'nome' ("qualcosa" di seguito):

rails generate dynanav something --force 

che ha dato l'errore originale, quindi ho aggiunto:

def app_name 
    @name.titleize 
end 

alla classe e tutto andava bene.

3

mi sono imbattuto in un problema simile, nessuna delle variabili sopra elencate erano disponibili a me in Rails 4. Ho scoperto che @name era disponibile durante l'esecuzione

rails plugin new engines/dummy -m my_template.rb 

Ci sono altre variabili utili disponibili all'interno del modello . Puoi vedere di persona e giocare utilizzando pry. Dentro il mio modello ho aggiunto

require 'pry'; binding.pry 

e poi corse ls per visualizzare un elenco di variabili di istanza disponibili

ls -i 
instance variables: 
    @_initializer   @app_path @behavior @destination_stack @extra_entries @name   @output_buffer @shell 
    @_invocations   @args  @builder @dummy_path   @gem_filter  @options  @rails_template @source_paths 
    @after_bundle_callbacks @author @camelized @email    @in_group  @original_name @shebang 
+0

Questa risposta è la prova del tempo, dovrebbe essere quella superiore –

Problemi correlati