これは Rails RESTful URL の規則と一致しないため、おそらく独自のルートを作成する必要があるだけで、おそらくそれ以上のルートが必要になると思います。好奇心から、システムが「95Ali32」でロードするオブジェクトのタイプをどのように認識していると思いますか? これは、Sinatra や、ルーティングをより細かく制御し、規則を少なくするものを使用して構築する方がよい場合があります。
タイプとオブジェクトIDにマップするスラッグを含むテーブルを使用する1つの可能なアプローチを次に示します。
# migration
create_table :slugs do |t|
t.string :object_type, :null => false
t.string :object_id, :null => false
t.string :slug
t.timestamps
end
# models
class Slugs < ActiveRecord::Base
belongs_to :object, :polymorhic => true
end
class AModel < ActiveRecord::Base
has_one :slug, :as => :owner
end
# routes.rb
# note that anything else should go above this because this will catch all other URL's
get '*slug', to: 'slugs#show'
# controller
class SlugsController < ApplicationController
def show
@object = Slug.where(slug: params[:slug])
raise ActiveRecord::NotFound.new unless @object
render @object.kind
end
end
次に、オブジェクトのタイプごとにビューを作成する必要があります。この関連する質問を参照してください
アップデート
ここに別のアイデアがあります。ナメクジが必要なのはどれほどあいまいですか?各モデルに既知のコードがあり、ID が何らかの方法でエンコードされ、モデル コードに追加されている場合はどうなるでしょうか。次に、事前構成されたルートを使用して、コードでもっと簡単なことを行うことができます。
# You could generate this too, or just hard-code them
prefixes = ['8sZ', '95Ali']
[:a_model, :another_model].each do |model|
match "#{prefixes.pop}:id", :controller => model.to_s.underscore.pluralize, :action => :show, :as => model
end
これにより、これらのようなルートが得られます
/8sZ1 #=> AModelsController#show(:id => 1)
/95Ali341 #=> AModelsController#show(:id => 341)
これを別のレベルに進めて、 Friendly_id を使用してモデル ID のスラッグを生成できます。または、整数 ID の代わりに UUID を使用します (PostgreSQL でサポートされています)。