Table of Contents generated with DocToc

Ruby Client for REST API

This file implements a simple Ruby client library for using Parse's REST API. Rather than try to implement an ActiveRecord-compatible library, it tries to match the structure of the iOS and Android SDKs from Parse.

So far it supports simple GET, PUT, and POST operations on objects. Enough to read & write simple data.


This currently depends on the gems 'json' and 'patron' for JSON support and HTTP, respectively.

Getting Started


Gem Version

gem "parse-ruby-client"

To get started, load the parse.rb file and call Parse.init to initialize the client object with your application ID and API key values, which you can obtain from the dashboard.

require 'parse-ruby-client'

Parse.init :application_id => "<your_app_id>",
           :api_key        => "<your_api_key>"

If you don't like pasting this stuff in every time you fire up irb, save your api keys to .bash_profile or similar:

export PARSE_APPLICATION_ID="12345678"

Now you can just do this:


The test folder assumes this naming convention for environment variables, so if you want to run the tests, you must do this. But it's easy. And good for you, too.

Load API keys from global.json created by Cloud Code


The path defaults to "../config/global.json". So if you create a folder inside the root of a Cloud Code directory, and in that folder is a .rb file, just call Parse.init_from_cloud_code with no arguments and you're set.

With Parse::init_from_cloud_code, you can easily write Ruby tests for Cloud Code functions.

Creating and Saving Objects

Create an instance of Parse::Object with your class name supplied as a string, set some keys, and call save().

game_score = "GameScore"
game_score["score"]         = 1337
game_score["playerName"]    = "Sean Plott"
game_score["cheatMode"]     = false

Alternatively, you can initialize the object's initial values with a hash.

game_score = "GameScore", {
    "score" => 1337, "playerName" => "Sean Plott", "cheatMode" => false

Or if you prefer, you can use symbols for the hash keys - they will be converted to strings by Parse::Object.initialize().

game_score = "GameScore", {
        :score => 1337, :playerName => "Sean Plott", :cheatMode => false

ActiveRecord-style Models

I like ActiveRecord-style models, but I also want to avoid ActiveRecord-style model bloat. Parse::Model is just a subclass of Parse::Object that passes the class name into the initialize method.

class Post < Parse::Model

The entire source for Parse::Model is just seven lines of simple Ruby:

module Parse
  class Model < Parse::Object
    def initialize

Retrieving Objects

Individual objects can be retrieved with a single call to Parse.get() supplying the class and object id.

game_score = Parse.get "GameScore", "xWMyZ4YEGZ"

All the objects in a given class can be retrieved by omitting the object ID. Use caution if you have lots and lots of objects of that class though.

all_scores = Parse.get "GameScore"


Queries are supported by the Parse::Query class.

# Create some simple objects to query
(1..100).each { |i|
  score = "GameScore"
  score["score"] = i

# Retrieve all scores between 10 & 20 inclusive"GameScore")   \
  .greater_eq("score", 10)      \
  .less_eq("score", 20)         \

# Retrieve a set of specific scores"GameScore")           \
  .value_in("score", [10, 20, 30, 40])  \

Relational Data

post = "Post"

comment = "Comment"

post.array_add_relation("comments", comment.pointer)

q ="Comment")
q.related_to("comments", post.pointer)
comments = q.get
assert_equal comments.first["objectId"], comment["objectId"]

Push Notifications

push ={"alert" => "I'm sending this push to all my app users!"})

Batch Requests


posts ="Post").get
update_batch =
posts.each_slice(20) do |posts_slice|
  posts_slice.each do |post|
    post["title"] = "Updated title!"

Parse::Batch also has #create_object and delete_object methods. Both take instances of Parse::Object as the only argument.


batch =
  "method" => "POST",
  "path" => "/1/classes/GameScore",
  "body" => {
    "score" => 1337,
    "playerName" => "Sean Plott"
resp =!

Cloud Code

# assumes you have a function named "trivial"
function ="trivial")
params = {"foo" => "bar"}


  • Add some form of debug logging
  • ~~Support for Date, Pointer, and Bytes API data types~~
  • ACLs
  • Login