1

Rails 3では、次のようなURL構造を作成したいと考えています。

http://example.org/learn/cooking/cooking-101/can-anybody-cook

これは、次のコントローラーに対応します。

http://example.org/learn/subject/module/lesson

関連付けは次のようになります。

Subject has many Modules
Module belongs to Subject

Module has many Lessons
Lessons belongs to Module

Learnは単なるハブまたはダッシュボードであり、すべてのサブジェクトが一覧表示されます。他のコントローラーとの関連付けはありません。

RailsGuidesで、次のように複数のネストされたリソースを作成しないように警告していることを知っています。

resources :subjects do
  resources :modules do
    resources :lessons
  end
end

私が知っているのはそれだけです。私は少し立ち往生しています。誰かがルーティングを手伝ってくれませんか?

4

2 に答える 2

0

この場合、カスタムパスを指定してルーティング名前空間friendly_idgemを使用する必要があると思います。次のようなSmthが役立つはずです:

namespace :learn do
  resources :subjects, path: '' do
    resources :modules, path: '' do
      resources :lessons
    end
  end
end

インストールの詳細については、 railsクイックスタートfriendly_idをお読みください。クラスにcolumnとextendモジュールを追加する必要があります( 、、)。railscastも参照してください。slugfriendly_idSubjectModuleLesson

于 2013-01-17T08:42:32.820 に答える
0

この場合、リソースをネストするのではなく、サブジェクト、モジュール、およびレッスンごとにカスタム ショー ルートを作成する必要があると思います。

したがって、各リソースを次のように設定します。

resources :subjects, :except => [:show]
resources :modules, :except => [:show]
resources :lessons, :except => [:show]

次に、show routes を明示的に一致させます。

match '/learn/:subject/:module/:lesson' => 'lessons#show', :as => 'show_lesson'
match '/learn/:subject/:module' => 'modules#show', :as => 'show_module'
match '/learn/:subject' => 'subjects#show', :as => 'show_subjects'

これにより、show のルートをより細かく定義できます (これは、URL をカスタマイズする通常のアクションです)。

要件によっては、リソースをネストしたい場合もありますが、うまくいけば、いくつかのアイデアが得られます。

ところで、私は show_xxx ルートに show_ という名前を付けています。これは、名前が付けられたルートであることを明確にし、リソースで show を使用することにした場合に起こりうる衝突を避けるためです。

于 2013-01-17T04:38:25.543 に答える