2

さて、私は Rails を初めて使用し、フレームワークを使用してプロジェクト管理システムを作成しています。私のモデル、ビュー、およびコントローラーのいくつかでは、足場を使用しましたが、問題はありませんでした。他の部分については、すべての部分を自分でコーディングしました。

私のプロジェクトの概要として、その根底には多くのプロジェクトがあります。これらすべてのプロジェクト内で、複数の To Do リストを作成できます。各 To Do リストには、複数のタスクを含めることができます。これが、タイトルの「階層的」という意味です。

リスト ページを作成しました。ブラウザで直接 URL (例: http://localhost:3000/projects/3/lists/20/tasks/1) にアクセスすると、タスクが正しく表示されます。ただし、To Do リスト ビューの 1 つにあるリンクをフォーマットする方法がわかりません (タスクは通常、To Do リストの下に表示されますが、独自のビューに表示する必要があります)。

ここに私が現在持っているコードがあります:

<%= link_to "#{task.description}", project_list_tasks_url(@list.id,task.id) %>

link_to "#{task.description}"静的 URL (Google など) で使用してみたので正しいことはわかっていますproject_list_tasks_url(@list.id,task.id)が、ここで問題が発生しています。

誰でも私を助けることができますか?To-Do リストまたはタスク コントローラーとビューから、必要なだけコードを提供できます。

4

2 に答える 2

2

ルーティングの混乱を軽減するためのヒントをいくつか紹介します。慣れるまでは少し不安かもしれません。

ルーティング ルール #1

の出力を常にチェックしてrake routes、さまざまなルーティング メソッドを呼び出す方法を確認してください。ルートがどのように実行されるかは見てわかると思うかもしれませんが、コンパイルされたルート テーブルを見るまではわかりroutes.rbません。

あなたの場合、次の形式のルートが必要です。

/projects/:project_id/lists/:list_id/tasks/:id

そうであることを確認してください。そうである場合、呼び出しは次のようになります。

project_list_task_path(@project, @list, task)

ここでの引数は:project_id:list_idおよび:idであるため、この場合は 3 つすべてが必要であることに注意してください。:format通常のように、パス指定の括弧内は無視できます。

ルーティング ルール #2

_path完全な URL が厳密に必要な場合を除き、メソッドを使用してください。それらは短くなり、出力は読みやすく、デバッグしやすくなります。www.mysite.comまた、と を適切に区別しないと、ブラウザで誤って URL が反転したり、セッションの問題が発生したりすることもありませんsite.com

ルーティング ルール #3

ルーティング パス メソッドに提供されるとのタイミングには大きな違いがあることを忘れないでください。@project@project.id

to_paramルーターは、利用可能な場合は常にメソッドを呼び出します。モデルでこれをオーバーライドして、きれいな URL またはわかりやすい URL を生成できます。idあなたのデータベースとあなたのデータベースだけのためのものです。to_paramルーティング用ですが、非常に不規則なことをしていない限り、手動で呼び出すべきではありません。

于 2012-11-28T01:57:38.313 に答える
1

通常、リソースを1レベル以上深くネストすることはできませんが、それを除けば、link_to形式は次のようになります。

link_to task.description, project_list_task_path(@project, @list, task)

つまり、でproject_link_tasks_urlある必要があり、最初の引数としてproject_link_task_urlを渡す必要があります@project(プロジェクトの名前は)であると想定しています@project。オブジェクト自体をIDではなく引数として渡すことができるように切り替えまし_urlた。_path

詳細については、オブジェクトからのパスとURLの作成に関するドキュメントを参照してください。

于 2012-11-28T01:54:25.197 に答える