Newbie question about views folder

Hi,

I just started out learning Ruby on Rails this week. I'm using Michael Hartl's book, but I'm working on a remote server rather than my local computer. As such, I'm using Apache + Passenger to deploy the example programs rather than Mongrel. Also, I'm using MySQL for my database instead of SQLite.

My issue is that I don't understand how to deploy a program on a remote server using Apache + Passenger in a way that makes the contents of the views directory accessible. For instance, if I create a sample program 'demo_app' and create a 'users' resource with the command:

$ script/generate scaffold User name:string email:string

and then migrate with the command:

$ rake db:migrate

I can't see the 'users' folder or anything in it when I point my browser to the remote server. I can see the standard 'Welcome aboard!' page at http://<server_addr>/demo_app, but http://<server_addr>/demo_app/users gives me a 404 Not Found. In my apache2.conf file, I have the following VirtualHost specification:

<VirtualHost *:80>         ServerName <server_addr>         DocumentRoot /projects/demo_app/public         RailsBaseURI /demo_app </VirtualHost>

In my web root directory, 'demo_app' is a symbolic link to the application's public directory. I realize that there's nothing in my web root directory or the above VirtualHost specification that points to the 'users' resource, but when I build this app locally and view it with Mongrel, I can see http://0.0.0.0:3000/users just fine. All of the documentation I've read indicates that the above specification and symbolic link are all I need to create to deploy an app on a remote server with Apache + Passenger. Do I need to do something else to access http://<server_addr>/demo_app/users? Have I missed an obvious or elementary step? Am I misunderstanding something? Am I on another planet?

Any help would be greatly appreciated.

Hi Frank,

In my web root directory, 'demo_app' is a symbolic link to the application's public directory. I realize that there's nothing in my web root directory or the above VirtualHost specification that points to the 'users' resource, but when I build this app locally and view it with Mongrel, I can seehttp://0.0.0.0:3000/usersjust fine. All of the documentation I've read indicates that the above specification and symbolic link are all I need to create to deploy an app on a remote server with Apache + Passenger. Do I need to do something else to access http://<server_addr>/demo_app/users? Have I missed an obvious or elementary step? Am I misunderstanding something? Am I on another planet?

Deploying an app to a sub uri (rather than to the root of your domain) is not the simplest case - you might want to try that first to reassure yourself that everything is basically working. What you've done doesn't seem to quite match the instructions at http://www.modrails.com/documentation/Users%20guide%20Apache.html#deploying_rails_to_sub_uri

Fred

Hi Fred,

For instance, if I create a sample program 'demo_app' and create a 'users' resource with the command:

$ script/generate scaffold User name:string email:string

and then migrate with the command:

$ rake db:migrate

I can see the standard 'Welcome aboard!' page at http://<server_addr>/demo_app,

That's a good sign.

but http://<server_addr>/demo_app/users gives me a 404 Not Found.

Did you generate the new scaffold after your app was already running under Passenger? If so, and it's environment is set to production, did you modify the tmp/restart.txt file in your app to signal Passenger to restart the application?

but when I build this app locally and view it with Mongrel, I can see http://0.0.0.0:3000/users just fine.

That's probably also a good sign. I bet you just need to have Passenger reload the app as mentioned above. Details can be found at:

http://www.modrails.com/documentation/Users%20guide.html#_redeploying_restarting_the_ruby_on_rails_application

Thanks everyone for your replies.

Okay, so this is interesting. When I try deploying the app to the domain root, I can't see the "Welcome aboard!" page; instead, I see the index.html page that's in Apache's web root directory. Also, when I try http://<server_addr>/users, I see a directory listing of the (.erb) files that are in the demo_app/app/views/users. Does this mean that Passenger is not set up correctly?

I don't know if it matters, but the server I'm using doesn't have a domain name; I'm accessing it using its IP address.

FrankMurphy wrote:

Thanks everyone for your replies.

Okay, so this is interesting. When I try deploying the app to the domain root, I can't see the "Welcome aboard!" page; instead, I see the index.html page that's in Apache's web root directory. Also, when I try http://<server_addr>/users, I see a directory listing of the (.erb) files that are in the demo_app/app/views/users. Does this mean that Passenger is not set up correctly?

Yes.

For your own sanity, set up Rails on your local box and don't worry about the remote server yet.

I don't know if it matters, but the server I'm using doesn't have a domain name; I'm accessing it using its IP address.

Shouldn't matter.

On May 21, 7:47�pm, Frederick Cheung <frederick.che...@gmail.com>

Best,

Okay, I got it to work on the domain root by editing /etc/apache2/ sites-available/default to point to the app's public directory. Is that the right way to go about it, or is that just a hack? If that's what I'm supposed to do, it seems odd that this step isn't mentioned in the mod_rails user guide. I still can't get it to work on a sub-uri using an analogous technique (i.e., creating a virtual host file for the URI in /etc/apache2/sites-available)...

Yes I think that matters, in the example you gave in the first post you had

<VirtualHost *:80>        ServerName <server_addr>        DocumentRoot /projects/demo_app/public        RailsBaseURI /demo_app </VirtualHost>

This is what Apache calls a name-based virtual host

http://httpd.apache.org/docs/2.2/vhosts/name-based.html

If you use an ip address like 192.168.1.123 as the value for the ServerName directive, apache will do a reverse dns search to try to find a NAME. http://httpd.apache.org/docs/2.2/mod/core.html#servername

If the server actually has a unique ip address for the app, then you might look at setting up an ip address based virtual host after reading the caveats in the first section of the first url I cited.

But the simpler thing would probably be to use a name based vhost and configure the client's dns to resolve the name to the ip address so you can use it in the browser urls.

Just putting a line in /etc/hosts (or the equivalent if the client is a doze machine) should be enough.