1

私は困惑したままのプロジェクトに取り組んでいます。誰かが興味深い情報を提供してくれることを願っています。URL の難読化に使用できる gem がいくつかあるようですが、それらはコントローラ レベルではなくスラッグ レベルで停止しているようです (つまり、www.foo.com/mycontroller/8sZ16lp)。www.foo.com/8asd31Ud の行に沿って、コントローラー名を削除して何かを作成する方法を探しています。obsufacate_id gem のドキュメントを確認しましたが、それほど進んでいないようです。

より多くの背景を説明するために-私は本当にwww.foo.com/mycontroller/15/edit = www.foo.com/95Ali32を持っていることを望んでいます

4

1 に答える 1

0

これは 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 でサポートされています)。

于 2015-02-03T01:14:48.600 に答える