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

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

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

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2442閲覧

ユーザー一覧ページにあるリンクを押した後、選択したユーザーの投稿だけを一覧表示したい

harukome

総合スコア26

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/04/16 14:31

編集2022/04/16 14:36

前提

ruby on railsで過去の出来事について投稿するSNSのようなものを製作しています。
ユーザー一覧ページから、選択したユーザーの投稿一覧ページへ飛ぶようにしているのですが選択したユーザー以外の投稿も一緒に表示されてしまいます。

実現したいこと

  • ユーザー一覧ページから特定のユーザーを選択すると、その人の投稿した記事のみが一覧で表示されるようにしたいです。

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

エラーメッセージは出ていません。
ユーザーネームの横の「○○の詳細へ」をクリックした時、コマンドプロンプトは以下のように動いています。(user_id === 3の詳細ページへ飛ぼうとした場合)

Started GET "/posts/index_public.3" for ::1 at 2022-04-16 23:24:04 +0900 Processing by PostsController#index_public as */* User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] Rendering layout layouts/application.html.erb Rendering posts/index_public.html.erb within layouts/application Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."setting" = ? ORDER BY "posts"."date" ASC [["setting", 1]] ↳ app/views/posts/index_public.html.erb:2 Rendered posts/index_public.html.erb within layouts/application (Duration: 12.2ms | Allocations: 843) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 82.3ms | Allocations: 5570) Completed 200 OK in 100ms (Views: 91.4ms | ActiveRecord: 0.6ms | Allocations: 7168)

該当のソースコード

1,ユーザー一覧のviewページ

views/others/index.html.erb

1<h3>他のユーザー一覧</h3> 2<p> 3自分は<%= @current_user.name %>です 4<% @users.each do |t| %> 5<%= t.name %> 6<%= t.id %> 7<%= link_to "#{t.name}の詳細へ", index_public_posts_path(t.id) %> 8<% end %> 9</p>

2,選択したユーザーの投稿一覧viewページ

views/posts/index_public.html.erb

1<div class="posts-container"> 2 <% @posts.each do |t| %> 3 <div class="post"> 4 <%= t.title %> 5 <%= link_to "詳細へ", show_public_post_path(t.id) %> 6 </div> 7 <% end %> 8</div>

3,コントローラー

others_controller.rb

1def index 2 @users = User.where.not(id: current_user.id) 3 @current_user = User.find_by(id: current_user.id) 4end

posts_controller.rb

1 def index_public 2 @posts = Post.where(params[:id]).where(setting: "true").order(date: "ASC") 3 end

4,ルーティング

routes.rb

1 resources :posts do 2 resources :likes, only: [:create, :destroy] 3 collection do 4 get :index_private, controller: 'posts', action: 'index_private' 5 get :index_public, controller: 'posts', action: 'index_public' 6 end 7 member do 8 get :show_private, controller: 'posts', action: 'show_private' 9 get :show_public, controller: 'posts', action: 'show_public' 10 end 11 end 12 13 get 'others/index' => 'others#index'

試したこと

user_idがうまく渡せていないのではないかと考え、ルーティングの「get :index_public, controller: 'posts', action: 'index_public'」の部分をmember doの方に記載場所を変更したのですがうまくいきませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

routes.rb の定義と link_to のパラメーターに問題があります。
logをみると /posts/index_public.3 になっています。これは /posts/index_public へ format 3 で送るという意味になってしまいます。
これが /posts/index_public/3 もしくは /posts/index_public?id=.3 にならねばなりません。
今の routes のままでやるなら、 index_public_posts_path(id: t.id)
今の viewのままでやるなら get 'posts/index_public/:id' => 'posts#index_public'
as :index_public_posts が必要かも。

なお、<% @users.each do |t| %><% @users.each do |user| %> にしたほうが良いです。
@posts.each do |t| @posts.each do |post|

投稿2022/04/17 01:06

winterboum

総合スコア23331

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

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

harukome

2022/04/17 01:36

ご回答ありがとうございます。logについてのご説明とても納得しました。 index_public_posts_path(id: t.id)とリンクを変更し、 routeも, resources :posts do resources :likes, only: [:create, :destroy] collection do get :index_private, controller: 'posts', action: 'index_private' #get :index_public, controller: 'posts', action: 'index_public' end member do #get :index_public, controller: 'posts', action: 'index_public' get :show_private, controller: 'posts', action: 'show_private' get :show_public, controller: 'posts', action: 'show_public' end #コメントを基にやってみた get 'posts/index_public/:id' => 'posts#index_public', as: :index_public_posts end に変更したのですが「AbstractController::ActionNotFound (The action 'show' could not be found for PostsController」というエラーが出てしまいました。 先ほど試行錯誤の過程で、routeをmember do内に書くように変更し、 resources :posts do resources :likes, only: [:create, :destroy] collection do get :index_private, controller: 'posts', action: 'index_private' #get :index_public, controller: 'posts', action: 'index_public' end member do get :index_public, controller: 'posts', action: 'index_public' get :show_private, controller: 'posts', action: 'show_private' get :show_public, controller: 'posts', action: 'show_public' end end コントローラーを以下のように変更すると def index_public @posts = Post.where(user_id: params[:id]).where(setting: "true").order(date: "ASC") end 一応望む結果は得られました。 logは/posts/3/index_publicとなるのですが、これでも問題はないのでしょうか??
winterboum

2022/04/17 01:43

あら、viewとroutes両方変えちゃったのか。。 「今の routes のままでやるなら」って書いておいたのに。 望む結果が得られたのなら、/posts/3/index_public でも良いのでは。
harukome

2022/04/17 02:35

はじめはリンクだけ変更したのですが状況が変わらなかったのでrouteも変えてしまいました、、、。 ですが先ほど、controllerを@posts = Post.where(user_id: params[:id]).where(setting: "true").order(date: "ASC")に変更したままでviewのみ変更して再チャレンジしてみたところ上手くいきました。user_idを記述していなかったのがviewだけ変更しても変わらなかった原因のようでした。 今回はとりあえず/posts/3/index_publicでいってみようかなと思います。 ご回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問