views:

658

answers:

4

I'm messing around with rails 2.3 templates and want to be able to use the app name as a variable inside my template, so when I use...
rails appname -m path/to/template.rb
...I want to be able to access appname inside template.rb. Anyone know how to do this?
Thanks

+1  A: 

RAILS_ROOT will give you the absolute path to your root directory. Your app name will be the portion of the string after the final '/' which you can grab in any number of ways.

EDIT: Not quite enough to get the job done. Mike and Dan iron it out below.

Abie
+1  A: 

There's probably a more straightforward way, but this seems to work:

RAILS_ROOT.split('/').last

EDIT: Bleah - this got voted down once, and the voter was right. If I'd read the question more carefully, I'd have noticed the 2.3 and template.rb elements. Apologies.

I suspect that RAILS_ROOT won't have been created at the point that you need the app name. Looking at ruby\lib\ruby\gems\1.8\gems\rails-2.2.2\bin\rails, however, almost the first thing that happens is this:

app_path = ARGV.first

It's used at the end of the script to allow a chdir and freeze to be done if needed - I didn't know I could insta-freeze at creation, so I learned something new at least. ARGV then gets used here:

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

which quickly gets us to the place where ARGV is really handled:

rails-2.3.1\lib\rails_generator\scripts.rb

where I see

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

Somewhere below here is probably where the templating gets handled. I'm afraid I'm at a very early stage with 2.3 and templating is an area that I haven't looked at yet.

Does that help any better than my first effort?

Mike Woodhouse
+8  A: 

Thanks for the answers. Mike Woodhouse, you were so close. Turns out, all you need to do to access the appname from inside your rails template is...
@root.split('/').last
The @root variable is the first thing created when initializing templates and is available inside your rails templates. RAILS_ROOT does not work.

danengle
A: 

I believe the preferred way now is to call Rails.root and no longer RAILS_ROOT. Apparently someone on planet rails has an aversion to uppercase or some similar important reason. As of 2.3.5 they both appear to work.

RonanOD