質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

1620閲覧

ActionController::UrlGenerationError in StaticPages#top

toroupyoro

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/08/15 13:43

編集2019/08/16 05:39

前提・実現したいこと

簡易なタスク管理アプリを作成しています。
ヘッダーのタスク管理一覧からタスク一覧に遷移が出来ません。

発生している問題・エラーメッセージ

ActionController::UrlGenerationError in StaticPages#top

該当のソースコード header.html

rb

<header class="navbar navbar-fixed-top navbar-inverse"> <div class="container"> <%= link_to "Task App", root_path, id: "logo" %> <nav> <ul class="nav navbar-nav navbar-right"> <li><%= link_to "トップ", root_path, id: "header-list" %></li> <% if logged_in? %> <li><%= link_to "タスク作成", '#', id: "header-list" %></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <%= current_user.name %><b class="caret"></b> </a> <ul class="dropdown-menu"> <li class="dropdown-header">ユーザー</li> <li><%= link_to "プロフィール", current_user %></li> <li><%= link_to "設定", '#' %></li> <li class="dropdown-header">タスク</li> <li><%= link_to "タスク一覧", user_tasks_path %></li> <li class="divider"></li> <li><%= link_to "ログアウト", logout_path, method: :delete %></li> </ul> </li> <% else %> <li><%= link_to "ログイン", login_path %></li> <% end %> </ul> </nav> </div> </header>

該当のソースコード task controller

rb
class TasksController < ApplicationController
def index
@user = User.find(params[:user_id])
end
end

該当のソースコード route.rb

rb
Rails.application.routes.draw do
root 'static_pages#top'
get '/signup', to: 'users#new'

post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'

resources :users do
member do
get 'edit_basic_info'
patch 'update_basic_info'
end
resources :tasks
end
end

試したこと

task controllerの@user = User.find(params[:user_id])記述がおかしいと思い
試行錯誤しましたが、遷移出来ずエラーとなります。
その他どこかおかしいとは思いますが、該当箇所が不明のため教えて頂きたいです。

補足情報(FW/ツールのバージョンなど)

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

routes.rbには、

root 'static_pages#top'

と書かれているため、'/'ページにアクセスすると、
static_pages_ontroller.rbにある、def topを実行しようとします。

しかし、おそらく存在するControllerはtasks_controller.rbであり、static_pages_ontroller.rbは存在しません。

そのためエラー内容のような、エラーが発生しています。

例えば解決策として、

root 'tasks_controller#index'

としてあげると、tasks_controller.rbdef indexを実行してくれます。
本エラー以外のエラーがなければこれでうまくいくようになるかもです。

追記

user_tasks_pathは、エラー内容を見ると、TasksControllerのShowアクションをしようとしています。
これはおそらく正しい動きです。なので

1.TasksControllerにShowアクションを追加します。

def show @user = User.find_by(id: [:id]) #[:user_id]かも? end
  1. user_task_pathにユーザーを特定するidを渡してあげる必要があります

user_task_path(current_user.id) #current_userは仮で置きました。userのidを渡せれば大丈夫です。

3.特定ユーザーのタスクを表示

<% @user.tasks.each do |task| %> <%= task.name %> # @user.tasksで1.で特定したユーザーのタスク一覧が表示されます <% end %>

とやるといかがでしょうか?

投稿2019/08/15 14:52

編集2019/08/16 01:14
hatsu

総合スコア1809

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toroupyoro

2019/08/15 15:40 編集

hatsuさんご連絡ありがとうございます ご連絡頂いた内容では解決出来ませんでした。 記述方法が間違っているかも知れませんが 【実現したいこと】 対象のユーザーが持つタスクのみが一覧表示されていることです。 【以下のコードがおかしいと思われる点です】 ご指摘願います。 header_htmlの   <li><%= link_to "タスク一覧", user_tasks_path %></li> task.controllerの   def index    @user = User.find(params[:user_id])   end ルートは以下を使用   user_tasks_path GET /users/:user_id/tasks(.:format) tasks#index
hatsu

2019/08/15 15:44

現在、 /users/:user_id/tasks(.:format) のURLにアクセスすると、 ActionController::UrlGenerationError in StaticPages#top というエラーが発生しているのでしょうか? またコード部分は、コードブロック ``` hoge ``` で囲う形式で書いていただくと読みやすかったりします!
toroupyoro

2019/08/15 16:01

hatsuさん hatsuさんのご認識通りです。 今後コードブロックを使用していきます。 本日初めて質問をしたので、使い方がわかっておりませんでした。
hatsu

2019/08/15 16:05

おそらく、root_pathが私が回答したような理由で動いていない(?)。 しかしそのroot_pathを header.htmlで使用しているのでエラーが出ているのかと思いました。 <%= link_to "Task App", root_path, id: "logo" %> <li><%= link_to "トップ", root_path, id: "header-list" %></li> この2行をheader.htmlから削除するとどうなるでしょうか? また'/'へのアクセスは正常に動くでしょうか?
toroupyoro

2019/08/15 16:22

削除してみましたが、解決出来ません。 hatsuさんのアドバイス通りに出来ていないかも知れません。 コードを直接レビューして頂ければすぐに解決して頂けると思いますが、 画像を添付する方法がわかりません。 せっかくご指導頂いているのに、結果が出せなくて申し訳ありません。
toroupyoro

2019/08/15 16:26

画像を補足に追加出来ました。
hatsu

2019/08/15 16:47

ちょっと構成の不明点が多くなってしまいそうです。。 ちなみに、 タスク一覧ページへの遷移が出来ないだけ、か タスク一覧ページの表示も出来ない(URLへ直アクセスするなどして) かではどちらでしょうか? また、 resources :tasks が resources :users do ~ end  内に書かれているのは意図的でしょうか? 「最後に動いていた状態」と「エラー時」との差分がどこまでかが判断できておらず。。 ご質問させていただきましたmm
toroupyoro

2019/08/15 16:54

タスク一覧ページへの遷移が出来ないだけです。 特定のユーザーのタスク一覧のみを表示したい為、 usersリソースの中にtaskリソースを記述する形にしています。 ヘッダーの 、、、、 <li><%= link_to "タスク一覧", user_tasks_path %></li> 、、、、 user_tasks_pathを記述してからページ遷移が出来なくなりました。
toroupyoro

2019/08/16 03:18

何度もご連絡頂きありがとうございます。 状況が少し変わりました。 indexの記述を修正すれば解決出来そうに思います。
toroupyoro

2019/08/16 03:19

画像追加しました。
toroupyoro

2019/08/16 03:23

TasksControllerのShowアクションを実行しようとしてしていたのは、 user_task_path となっており、tasks#showを実行 user_tasks_path が正しく tasks#index 実行となる為、 task controllerの indexに記述しました。
hatsu

2019/08/16 03:45

Railsだとfindとfind_byは異なるため、 [参考](https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3) User.find_by(id: params[:user_id]) か User.find(params[:id]) のように書く必要があります。 Paramsの内容によって修正してください。 また、回答ではparamsをつけ忘れております。失礼しました。
toroupyoro

2019/08/16 05:09 編集

@user = User.find_by(id: params[:user_id])はこれで問題ないと思います。(画像を追加しました) あとは、タスクが表示できるようにeachメソッドと tasks_controller のindex @taskの記述さえ修正出来ればいいと思いますが、以下のどれでもダメでした。 特定のユーザーのタスクを取得する。という記述にしたいです。 ,,,,,,,, @tasks = Task.find_by(id: params[:user_id]) @tasks = Task.find_(params[:user_id]) @tasks = Task.all ,,,,,,,,, hatsuさんでしたらどのように記述しますか?
hatsu

2019/08/16 05:10

回答に追記した通り、@user.tasksがいいかなと思いました。不要なインスタンス変数を作らないためにも。 もし@tasksで特定ユーザーのタスクを表示する場合はfind_byだと該当する一件しか取得できない為、 以下のようにwhereを使うと良いと思います。 @tasks = Task.where(user_id: params[:user_id])
toroupyoro

2019/08/16 05:38

hatsuさんの記述通り、@user.tasksしっくりくると思いました。 しかしながら、エラーとなります。 何か他のエラー要因となるような記述しているのかも知れません。(画像を追加しました)
hatsu

2019/08/16 08:05

あ、@user.tasksの使い方は、追記の3番のような書き方をイメージしていました。これは***.html.erbに書く必要があります。 Controller内でユーザーのタスク一覧を取得するならば、 @tasks = @user.tasks でできます。
toroupyoro

2019/08/16 12:30

hatsuさん そうですね  ,,,,,, def index @tasks = @user.tasks end ,,,,,, でやりました。しかしながら、一覧に一つもデータがない為か、 エラーとなります。 したがって、まずは新規登録ページを作成し、一つタスクを追加してみようと思います。 従って、解決とまでは言っていませんが、かなり近づいたと思います。 早急に新規作成ページを作成し、一覧が表示できるようしたいと思います。 また報告します。 hatsuさんをフォローさせて頂きました。 一旦、ご協力ありがとうございますとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問