NOTE

This gem is deprecated in favor of the new Rewritten gem. It’s better to make use of the new gem because being Rack based it decouples URLs from your App: no need alter routing, models, controllers and views as with the SpeakingURL gem here.

Speaking URL

The Speaking URL Gem provides an extension for the routes.rb file of your Rails-App to allow for arbitrary URL being used for resources. The Gem is mainly SEO-motivated; it facilitates:

  • Usage of so called “static” or “nice-looking” URLs,

  • Implementation of a SEO friendly URL strategy,

  • Usage of different style URLs for resources of the same type

  • And (from a SEO-point maybe most importantly) Modification of URL strategies with proper HTTP (301) redirects.

This Gem does not:

  • generate URLs

  • manage all of your App’s URLs

These points have to by managed by yourself.

Installation

Add the gem to your Rails-App by including it in your Gemfile:

gem "speaking_url"

Usage

A quick list of steps that have to be done in order to get started with using this Gem follows.

Usage in your models

The Speaking Url must be setup within the models (resources) that you want to assign a Speaking URL to.

class Person
  include Mongoid::Document
  include SpeakingUrl::MongoResource
end

This adds an array field urls to the Person resource, where the current url and the url history are stored.

To add a new route to a some resource, use the add_mapping method instead of modifying the field directly.

@person.add_mapping('/some/new/mapping')

Core Extensions

The gem comes with some helpful inflection methods for the String class.

  • urlify : replaces all white space and special characters with dashes

  • unumlaut : converts German Umlauts to their ASCII counterparts

Additionally, the methods upcase and downcase are made Umlaut aware.

Configuring routes

To actually deploy the new routes, the Gem ships with the speaking_url_resource method. You simply provide the resources as symbols:

speaking_url_resource :person, :product

As a a result both - the person and product resource - are made accessible by their speaking url(s). The controller is inferred from the model name, but can be customized:

speaking_url_resource :person, :controller => 'vip/persons'
speaking_url_resource :product, :controller => 'my_products'

NOTE: You probably want to include the lines as one of your last statements in your route.rb file to:

  • give standard routes higher priority

  • and achieve better performance (due to DB calls in the routing process)

Usage in Controllers

In the appropriate controllers actions a specific resource is no longer fetches by it’s databse ID, but by the request.path:

@search = Person.find_by_url(request.path)

You can be sure there that a resource is found because otherwise the the controller wouldn’t have been called by the routing mapper.

Usage in views

Instead of using the default rails route helpers in your views, you want to use the speaking url helpers:

<%= link_to "A nice person", @person.current_url %>

Outlook and Todo

So far the Gem is pretty limited. What could be developed for following version is:

  • more configuration options

  • support for other persistent storage mappers

  • go to a single table/collection implementation for performance and more flexibility (i.e. index and create actions/routes)

  • make this a rack application

License

GPLv3. Copyright 2011 Kai Rubarth.