Skip to content
A RESTful unobtrusive jQuery Inplace-Editor and a helper as a Rails Gem
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Best In Place

The Unobtrusive in Place editing solution


Best in Place is a jQuery based AJAX Inplace-Editor that takes profit of RESTful server-side controllers to allow users to edit stuff with no need of forms. If the server have standard defined REST methods, particularly those to UPDATE your objects (HTTP PUT), then by adding the Javascript file to the application it is making all the fields with the proper defined classes to become user in-place editable.

The editor works by PUTting the updated value to the server and GETting the updated record afterwards to display the updated value.



  • Compatible with text inputs
  • Compatible with textarea
  • Compatible with select dropdown with custom collections
  • Compatible with custom boolean values (like checkboxes)
  • Sanitize HTML and trim spaces of user's input
  • Displays server-side validation errors

Usage of Rails 3 Gem

best_in_place Object, Field, [formType, [selectValues, [urlObject, [nilValue]]]]

The Object parameter represents the object itself you are about to modify. The field (passed as symbol) is the attribute of the Object you are going to display/edit. You can add the formType [:input, :textarea, :select, :checkbox] or it defaults to :input. In case you chose :select, you must specify the collection of values it takes through the selectValues param. In case you use :checkbox, you can user the parameter selectValues to specify the two possible boolean values. If the Object url cannot be obtained directly from the Object, you can pass the parameter urlObject the same way you pass any url in Rails. The last parameter nilValue allows you to customize the null value, in case the user deletes the contents. By default it will display "-".

I created a test_app and a running demo in heroku to test the features.

Examples (code placed in the views):


<%= best_in_place @user, :name, :input %>

<%= best_in_place @user, :name, :input, nil, nil, "Click me to add content!" %>


<%= best_in_place @user, :description, :textarea %>


<%= best_in_place @user, :country, :select, [[1, "Spain"], [2, "Italy"], [3, "Germany"], [4, "France"]] %>

Of course it can take an instance or global variable for the collection, just remember the structure [[key, value], [key, value],...]


<%= best_in_place @user, :receive_emails, :checkbox, ["No, thanks", "Yes, of course!"] %>

The first value is always the negative boolean value and the second the positive [false, true]. If not defined, it will default to Yes and No options.

Display server validation errors

If you are using a Rails application, your controller's should respond to json in case of error. Example:

def update
  @user = User.find(params[:id])

  respond_to do |format|
    if @user.update_attributes(params[:user])
      format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
      format.json { head :ok }
      format.html { render :action => "edit" }
      format.json { render :json => @user.errors.full_messages, :status => :unprocessable_entity }

At the same time, you must define the restrictions, validations and error messages in the model, as the example below:

class User < ActiveRecord::Base
  validates :name,
    :length => { :minimum => 2, :maximum => 24, :message => "has invalid length"},
    :presence => {:message => "can't be blank"}
  validates :last_name,
    :length => { :minimum => 2, :maximum => 24, :message => "has invalid length"},
    :presence => {:message => "can't be blank"}
  validates :address,
    :length => { :minimum => 5, :message => "too short length"},
    :presence => {:message => "can't be blank"}
  validates :email,
    :presence => {:message => "can't be blank"},
    :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "has wrong email format"}
  validates :zip, :numericality => true, :length => { :minimum => 5 }

When the user tries to introduce invalid data, the error messages defined in the model will be displayed in pop-up windows using the jQuery.purr plugin.


It works by simply copying and loading the files from the folder /public/javascripts to your application and loading them in your layouts in the following order:

  • jquery-1.4.2.js
  • jquery.purr.js
  • best_in_place.js

The last one you can copy it (and keeping up to date to the last version) by running the following generator in your application's root:

rails g best_in_place:setup

To be able to use the script the following block must be added as well:

$(document).ready(function() {
  /* Activating Best In Place */

In order to use the Rails 3 gem, just add the following line to the gemfile:

gem "best_in_place"


  • Client Side Validation definitions
  • To accept given click handlers
  • To accept a handler to activate all best_in_place fields at once
  • Specs


  • v.0.1.0 Initial deploy
  • v.0.1.2 Fixing errors in collections (taken value[0] instead of index) and fixing test_app controller responses
  • v.0.1.3 Bug in Rails Helper. Key wrongly considered an Integer.

Authors, License and Stuff

Code by Bernat Farrero based on the original project of Jan Varwig and released under MIT.

Something went wrong with that request. Please try again.