Overview

This ruby gem is a Rails Engine for using the Houdini Mechanical Turk API. It provides easy integration into your models and sets up the necessary controllers to receive answers posted back to your app from Houdini.

Check out the Houdini Documentation for more info about the API.

Installation (Rails 2.3.x)

Add the gem to your Gemfile

gem 'houdini-rails'

Configure a few constants in config/application.rb

config.after_initialize do
  ::Houdini::KEY = 'YOUR_API_KEY'
  ::Houdini::HOST = 'houdinihq.com' # or 'houdini-sandbox.heroku.com' for testing
  ::Houdini::RAILS_HOST = 'your_app_domain.com'
end

You may want to configure the Houdini constants differently for each of you environments.

Example Usage

Setup Houdini in your ActiveRecord model:

class Post < ActiveRecord::Base
  include Houdini::Model

  houdini :image_moderation,
    :price => '0.01',
    :title => 'Please moderate image',
    :form_template => 'app/views/houdini_templates/post.html.erb',
    :on_task_completion => :process_image_moderation_answer

  after_create :moderate_image

  def moderate_image
    Houdini.perform!(:image_moderation, self)
  end

  def process_image_moderation_answer(params)
    update_attribute(:flagged => params[:flagged])
  end
end

Create a template for the form to be sent to Mechanical Turk:

<!--app/views/houdini_templates/post.html.erb -->

<h2>Review the image for offensiveness</h2>

<h3>Instructions</h3>
<p>Please review the image below.</p>

<img src="<%= post.image_url %>"><br/>

<input type="radio" name="flagged" value="yes" class="required">
  Yes, this picture is offensive
</input>

<input type="radio" name="flagged" value="no" class="required">
  No, this picture is okay
</input>

Post.houdini class method options:

  • :price - Amount in cents you want to pay for the task to be completed
  • :title - Title that Mechanical Turk workers will see when browsing/searching available tasks
  • :form_template - ERB or HAML template used to render the form html.
  • :on_task_completion - Method that Houdini should call when the answer is posted back to your app. The results of your form will be passed into the method as the only parameter. {:flagged => 'yes'} in the example above.