2016-11-09 22 views
4

私のRailsアプリケーションでは、データベースに格納されているページがあります。例えばので動的なページ用のネスト型ルーティング

id: 1 
name: 'About' 
slug: 'about' 
parent_id: null 

id: 2 
name: 'Team' 
slug: 'team' 
parent_id: 1 

id: 3 
name: 'Cameron' 
slug: 'cameron' 
parent_id: 2 

スラグがそうのようなルーティングを経由してそれらにアクセスするために使用されます。

match '/:slug' => 'pages#show', :via => :get, :as => :page 

だから私はでそれらのページにアクセスできます。

/about 
/team 
/cameron 

私がしたいのは、parent_idを使って、ルーティングが

0になるようにすることです。
/about/team/cameron 

これはルーティングのみを使用して達成できますか?あるいは私は何か他のことをする必要がありますか?

答えて

0

Friendly gemでヘルプを受けると、スラッグのルーティングが簡単になります。私の知る限り、動的paramlinksとルートに良い方法はありません知っているように、あなたはかなりのネストされたページのパスをキャプチャするという名前のルートを作成することができます

のようなルートを定義する

代替オプション:

get '/p/*id', :to => 'pages#show', :as => :nested_pages 

もページオブジェクトのスラッグを入れ子にして、すなわち親ページのスラグを追加するようにしてください。たとえば、次のように

page1.slug = '/about' 
page2.slug = '/about/team' # team is a child of about 
page3.slug = '/about/team/cameron' # cameron is a child of team 

あなたはこの仕事をするために、したがって、この

get '/p/*id', :to => 'pages#show', :via => :get, :as => :nested_pages or pages 

のようにそれを行うことができるように、あなたはおそらく、あなたのページのモデルクラスのメソッドをgenerate_slug変更することができます。

def generate_slug 
    name_as_slug = name.parameterize 
    if parent.present? 
    self.slug = [parent.slug, (slug.blank? ? name_as_slug : slug.split('/').last)].join('/') 
    else 
    self.slug = name_as_slug if slug.blank? 
    end 
end 
+0

私はパーマリンクを生成するために実際にこれが本当に好きです。あなたのコードを次のように修正しました: 'def generate_permalink name_as_permalink = slug.parameterize if parent_id.present? ( '/')。最後に])。( '/')最後に、 ') else permalink.blankの場合、self.permalink = name_as_permalink? end end' – Cameron

+0

ありがとうキャメロンそれはまた素晴らしいことができます –

1

ネストしたルートではこれを達成できませんが、route globbing and wildcardsで実行できます。

  1. それ以外の場合は、他のすべてのGETリクエストにマッチします、あなたのルートファイルの末尾にget '*path', to: 'pages#show'のようなワイルドカードのルートを追加します。私は、それはおそらくあなたのために、それを実現するのにかかる手順の概要を説明してみましょう。
  2. pages#showアクションでparams['path']のレコードを取得します。

最後のセグメントから開始し、見つけようとします。見つからない場合、そのページは存在しません。最後のスラッグセグメントの結果が得られた場合は、そのスラッグセグメントが次のスラッグセグメントと一致するかどうかチェックします。

もしそれが巨大な木になるのであれば、この解決策はおそらくパフォーマンスの問題を引き起こします。次に、どこかにパスを格納するか、PostgreSQL ltreeのようなソリューションを使用して実装することができます。

+0

"最後のスラッグセグメントの結果が得られたら、そのスラッグセグメントが次のスラッグセグメントと一致するかどうかチェックしてください。私はこれをどうやってやるかもしれないかの例を示すことができますか? – Cameron

+0

おそらくhttps://gist.github.com/openscript/7199e9b5515c45a4b7bc05d23dd7e9aaのようなものが動作します。これは擬似ルビコードのようなものです。あなたはいくつかのことを適応させる必要があります。 – Robin

+0

私たちはスラッグの最後のページだけに興味がありますか?なぜ残りのページをループする必要がありますか? – Cameron

関連する問題