0

Rails3.1.1とgemacts_as_treeを使用します。私はこの問題をグーグルで検索し、ここSOで同様の質問を確認しました(回答が古すぎるか、無関係です)。

今日のルートが次のような記事というモデルがあります。

  resources :articles, :path => '', :only => :show 
  resources :articles, :path => 'articles', :except => :show

「book」、「chapter1」、「chapter2」の3つの記事があります。本がchapter1とchapter2の親である場合。

今日、各記事への私の道は、host.com / book、host.com / chapter1、host.com/chapter2です。URLパスをhost.com/book/chapter1とhost.com/book/chapter2、つまりネストされたルートにします。

どうすればこれをクリーンでシンプルな方法で作成できますか?

基本的に、host.com /:parent_id /:parent_id /:idで、N個の:parent_idを持つパスが必要です。Wordpressの記事がルーティングされる方法とほぼ同じです。

ルートグロバーが解決策だとは思いませんが、間違っているかもしれません。host.com/:idとhost.com/foo/bar/:idで同じ結果が得られるようで、コンテンツが重複します。

4

4 に答える 4

1

3つの「記事」があります...「book」、「chapter1」、「chapter2」はすべて、「articles」という名前の同じ「リソース」を表します。同じ「リソース」をネストすることはできません。ネストされたルートが必要な場合は、親リソースと子リソースを別々に定義する必要があります。次のコードスピネットはあなたを助けるかもしれません

class Book < ActiveRecord::Base
  has_many :chapter
  accepts_nested_attributes_for :chapters
end    

class Chapter < ActiveRecord::Base
  belongs_to :book
  acts_as_tree :parent_id
end
于 2012-04-13T11:09:37.667 に答える
1

A)

ルーティングの解決策があり、それに関する唯一の問題が重複コンテンツの問題を懸念している場合は<link rel="canonical" href="...">、それらのリクエストから生成されたページに追加することを検討できます。しかし、グーグルがそれを提案と見なしているので、それは防弾ではありません。

ただし、ルートグロバーソリューションが親IDを使用してURLを生成するかどうかはわかりません。

B)

ルーティングを実行するために親IDは必要ありませんよね?それらをURLに含めて、それらのリクエストを、のようなURLを使用する場合と同じようにルーティングしたいだけですexample.com/chapter1

純粋にRailsレベルではないソリューションを検討する場合、Railsが処理する前に/:parent_id/:parent_id/:idなるようにそれらのリクエストのURLを書き換えるのはどうでしょうか。/:idのような静的プレフィックスがあれば、それは簡単です/articles/:parent_id/:parent_id/:id

これらのリソースにリンクするために、親IDを使用してURLを生成するために、いくつかのヘルパーを作成する必要があると思います。

重複コンテンツ

いずれにせよ、親IDを含むURLを生成する必要があるため、これらのURLを使用してこれらのリソースにリンクするだけであれば、重複コンテンツの問題が発生する可能性は低くなります。

于 2012-04-17T12:47:15.903 に答える
0
match '*p1/*p2/*p3/.../*pn' => 'articles#show'

...は文字通りではなく、nまで必要な数のパラメーターを定義するだけです。

URL:
host.com/book/chapter1
params[:p1] = 'book'
params[:p2] = 'chapter1'
params[:p3] = nil


URL:
host.com/book/chapter1/section2/sentence4
params[:p1] = 'book'
params[:p2] = 'chapter1'
params[:p3] = 'section2'
params[:p4] = 'sentence4'
params[:p5] = nil

それがあなたの最後のルートでなければなりません。

キャッチオールルートも動作不能になると思いますが、Rails 3のデフォルトroutes.rbでコメントアウトされています。これらを使用する場合は、古いスタイルのキャッチオールルートで通常処理されるすべてのルートを手動で指定する必要があります。 。

また、articlesという名前のコントローラーがある場合、すべてのコントローラーで「articles」というタイトルの本を作成することはできません。安全のために、おそらくすべてのコントローラーの名前を変更する必要があります。つまり、articlesはX_articlesになります。そのとき、X_articlesという本を呼び出すことはできません。

完全にテストされていません。

于 2012-04-15T18:56:19.330 に答える
0

あなたが探しているのは、それが作られていない何かのためにRailsを使うことです。ここでどのような答えが得られても、RESTful、DRY、またはActiveRecordで使用する意味がありません。アイデアを再構築するか、手遅れでない場合はアプリケーションを別のプラットフォームに持ち込むことを検討してください。

于 2012-04-15T19:13:08.583 に答える