Skip to content

Instantly share code, notes, and snippets.

@woodie
Created January 3, 2010 23:32
Show Gist options
  • Save woodie/268192 to your computer and use it in GitHub Desktop.
Save woodie/268192 to your computer and use it in GitHub Desktop.
Rails 2.3.5 on App Engine with DataMapper

Rails 2.3.5 on App Engine (DataMapper)

Do not use rvm (or install and run from JRuby). The google-appengine gem must install into your system MRI. The appengine-sdk gem includes a complete Java app server. We bootstrap Java from MRI, then your app runs inside a servlet container (with access to all the APIs) using the version of JRuby installed into each app.

We assumed Rails 2 would never work without rubygems, and we committed to gem bunlder for JRuby on App Engine, so we were waiting for Rails 3. Fortunately, Takeru Sasaki was able to patch the Rails 2.3.x calls to rubygems, and now we have it working. Rails 2.3.x currently spins up several seconds faster than Rails 3, and just a few seconds behind Sinatra.

See the TInyDS version also: gist.github.com/gists/269075

Install the Development Environment

One meta-gem provides the development environment

sudo gem install google-appengine

Install Rails 2.3.5 with required patches

Install some gems you’ll need

sudo gem install rails -v "2.3.5"
sudo gem install rails_dm_datastore
sudo gem install activerecord-nulldb-adapter

Create a folder for your app

mkdir rails_app; cd rails_app

Download and run the setup script

curl -O http://appengine-jruby.googlecode.com/hg/demos/rails2/rails235_appengine.rb
ruby rails235_appengine.rb

Working with Your Rails App

Start development server

./script/server.sh

Open local console

./script/console.sh

Publish to production

./script/publish.sh

Support for generators

We disable rubygems in the development environment, and the generators from Rails 2 perform various Gem dependency checks that are too difficult to patch, so we run the generators from the MRI. We also use Josh Moore’s rails_dm_datastore integration plugin.

Generate a restful controller and add it to config/routes.rb

./script/generate scaffold contact title:string summary:text \
birthday:date url:string address:string phone:string -f --skip-migration

Generate a model for DataMapper

./script/generate dd_model contact title:string summary:text \
birthday:date url:link address:postal_address phone:phone_number -f

You’ve created a RESTful controller, and a DataMapper model

class Contact
include DataMapper::Resource
storage_names[:default] = "Contact"
property :id, Serial
property :title, String, :required => true, :length => 500
property :summary, Text, :required => true, :lazy => false
property :birthday, Date, :required => true
property :url, Link, :required => true
property :address, PostalAddress, :required => true
property :phone, PhoneNumber, :required => true
timestamps :at
end
@joelcuevas
Copy link

If you want to use the XML versions of the generated scaffolds, you must install the dm-serializer gem because DataMapper doesn't generates valid XML. Of course, you have to require the gem somewhere before you models are used.

@huemorgan
Copy link

if someone needs it i got twitter working on APP ENGIEN using the twitter GEM
http://github.com/huemorgan/Twitter-on-GAE
notes:

  1. see the Gemfile for the gems that were bundled here.
    the gem versions matter, older versions don't support new fixes for GAE
    new versions of the twitter GEM currently has binary extentions also not supported by GAE.
  2. see that you set the right callback url in your twitter account
    it should match the oauth.set_callback_url in the session controller.
  3. used DataMapper for models http://gist.github.com/268192
  4. built on http://code.google.com/p/appengine-jruby/
  5. some valuable info here about bundeling gems and setting up a new project http://code.google.com/p/appengine-jruby/wiki/InstallEverything

@huemorgan
Copy link

How can I migrate appengien storage structure using DataMapper
DataMapper.auto_upgrade! - doesn't seem to work?

@masover
Copy link

masover commented May 19, 2010

No migration needed for trivial things like adding properties. You have to declare a 'property' in DataMapper so it generates accessors and things, but think of the entities themselves as basically hashes.

If you actually have something you want to change on a global level, that's a bit trickier, and would likely require a bit of task queue trickery if you want to do it on an actual live app.

@gvt
Copy link

gvt commented Jun 10, 2010

super helpful -- thanks!

@pedrorolo
Copy link

I am unable to follow these instructions: When I try publish the application, I get a message complaining that there are too many files. 8500 instead of the 3000 limit. Does anyone know how to overcome this problem?

@pedrorolo
Copy link

thanks

@pedrorolo
Copy link

no... using the 238 version of the script didn't do the trick. I am still getting the following message when I try to publish the app:

java.io.IOException: Applications are limited to 3000 files, you have 8914.
Unable to update app: Applications are limited to 3000 files, you have 8914.
Please see the logs [/tmp/appcfg2041444326558256837.log] for further information.

@woodie
Copy link
Author

woodie commented Jul 21, 2010

I'm guessing that you have do something bad to the Gemfile

@masover
Copy link

masover commented Jul 22, 2010

Maybe run a 'find' on your app directory and post that as a gist somewhere?

@pedrorolo
Copy link

masover: the files listing can be found here: http://gist.github.com/485749

woodie: what is the Gemfile? How can I tackle its problems?

By the way: My application is empty: I didn't change anything after having ran script that created the directory structure.

@millisami
Copy link

How to use the Rails 3.0.1 (latest) with app engine??
Is there any other resource coz I googled and couldn't find the exact for Rails 3.

@fcoloni
Copy link

fcoloni commented Dec 20, 2011

I publish the app and recive an Error: INTERNAL_SERVER_ERROR (500)
on local server runs ok

@imustardsoft
Copy link

I publish the app and recive an Error: INTERNAL_SERVER_ERROR (500)
on local server runs ok

Yes. I have same problem

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment