Если commit - это контроллер RESTful, который использует: sha вместо id для поиска записей. Вы можете сделать это вместо:
map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit'
Это создаст стандартные маршруты RESTful, которые выглядят как http://yoursite.tld/:user/:repo/commit/:id
Опять же, если вы никогда не будете переводить часть идентификатора в URL в идентификатор фиксации, то нет причин, по которым вы не можете использовать его в качестве значения: sha.
пример:
class CommitController < ApplicationController
def show
@commit = Commit.find(:first, :conditions => {:sha => params[:id]})
end
...
end
Вы также можете переопределить to_param в модели фиксации, чтобы вернуть значение ша.
class Commt < ActiveRecord::Base
...
def to_param
sha
end
end
Так что теперь link_to commit_url(@commit, :user => current_user, :repo => @repo)
предоставит URL, соответствующий вашей схеме.