Skip to content
Blurring the line between Mechanical Turk, Rails and usability testing..
Ruby Other
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Turkee Description

Seamlessly convert your Rails forms for use on Mechanical Turk. Then, easily import the data posted by the Mechanical Turk workers back into your data models.

External forms are created using a simple form helper. HITs are created by issuing a rake command. Retrieving submitted response data and importing that data into your model(s) requires just one more rake command.


If you'd like to jump straight into code, check out the Turkee Iterator example.


Make sure that the rturk gem is installed configured with your Amazon Turk credentials. I created a config/initializers/turk_task_config.rb file with the following in it:


RTurk::logger.level     = Logger::DEBUG
RTurk.setup(AWSACCESSKEYID, AWSACCESSKEY, :sandbox => (Rails.env == 'production' ? false : true))


Install the Turkee gem:

sudo gem install turkee

For Rails 2, add it to your environment.rb configuration as a gem dependency:

config.gem 'turkee'

For Rails 3, add it to your Gemfile as a gem dependency, then do a 'bundle install':

gem 'turkee'

To access the Turkee rake tasks, add the following to your application's Rakefile:

require 'tasks/turkee'

Run the turkee generator from your application directory to copy the needed migrations into your application:

./script/generate turkee    # Rails 2
rails g turkee              # Rails 3


1) Run your migrations :

rake db:migrate

2) You should disable form controls if the Turker hasn't accepted the HIT. You can determine this from your controller:

class SurveysController < ApplicationController

    def new
        @assignment_id = params[:assignmentId]
        @disabled      = Turkee::TurkeeFormHelper::disable_form_fields?(@assignment_id)

        # If you wanted to find the associated turkee_task, you could do a find by hitId
        #  Not necessary in a simple example.
        # @turkee_task   = Turkee::TurkeeTask.find_by_hit_id(params[:hitId]).id rescue nil

        @survey        =

3) Change your forms to use the form helper.

<% turkee_form_for(@survey, @assignment_id) do |f| %>
    <p><%= f.text_area :value, :disabled => @disabled %></p>
    <p><%= f.submit 'Create', :disabled => @disabled %></p>
<% end %>

Using the turkee_form_for helper will post the form to the Mechanical Turk sandbox if you're in development/test mode, otherwise it will be posted to Mechanical Turk production/live site.

4) Run the following rake task to post to Mechanical Turk :

# Host URL of your application
# Title of your HIT
# Description of your HIT
# Model name of your task form (the New action should be implemented)
# Number of assignments for HIT
# The reward for a successful completion
# The lifetime of the HIT in days (e.g. 5 days)

rake turkee:post_hit[<Host>, <Title>, <Description>, <Model>, <Number of Assignments>, <Reward>, <Lifetime>]

e.g. :
rake turkee:post_hit["","Please complete our survey","Tell us your favorite color.","Survey",100,0.05,2]
** Do not put spaces before or after commas for the rake task parameters

This will insert a row for the requested HIT into the turkee_tasks table. The turkee_tasks entry stores (along with the other properties) the HIT URL (e.g. ) and HIT ID (e.g. 1J1EXO8SUQ3URTTUYGHJ7EKUT11 ). These values are returned from Mechanical Turk when the HIT request is posted.

When a Turk worker views your HIT, the HIT will display your form within an iFrame. With the above example, Mechanical Turk will open an iFrame for the HIT assignment displaying the form

** The application that hosts your external forms preferably should have an https interface (you're going to have to buy an SSL certificate). If the forms are hosted on an unsecured host (http), because Mechanical Turk defaults to https, you're going to receive the ugly popup from IE regarding “mixed content” (

5) Allow some time for the Mechanical Turk workers (“Turkers”) to respond to your HIT.

6) Run the rake task that retrieves the values from Mechanical Turk and stores the user entered values into your model.

rake turkee::get_all_results

Rerun this task periodically to retrieve newly entered form values. You can setup this task as a cronjob to automate this.

crontab -e

# E.g. run every five minutes
*/5 * * * * cd /var/www/your/turk/application && rake turkee:get_all_results

Or you can directly call :


7) When a response is retrieved from Mechanical Turk, Turkee attempts to create a data row for the model specified using the corresponding retrieved data. If the row cannot be created (input failed model validations), the assignment is rejected. As for Mechanical Turk approval, if the row is created and you haven't specified your own custom approve? method for the model, the assignment will automatically be approved. If you'd like to add your own custom approval method, add the approve? instance method to your model. E.g. :

class Survey < ActiveRecord::Base
  def approve?
    (!response.blank? && !comment.blank?)


Copyright © 2010 - 2011 Jim Jones. See LICENSE for details.

Something went wrong with that request. Please try again.