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

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

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

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

Ruby on Rails

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

受付中

投稿データがたくさん並んでいるページのいいね!ボタンを投稿ごとに独立させたい

ninpig04
ninpig04

総合スコア0

Ruby

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

Ruby on Rails

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

0回答

0評価

0クリップ

6閲覧

投稿2018/02/12 23:12

編集2022/01/12 10:55

<やりたいこと>
現在各ページごとにユーザーが自由に意見を投稿できるサービスを作っています。
そのポストにいいねをつけられるようにしたいと考えています。
progateを見ながら作っているのですが、そこではpostコントローラのindexに書き込みが羅列されており、それをクリックするとshowに飛び、いいねができるようになっていたのですが、私はindexにポストを羅列して、そこでいいねができるようにしたいのです。(私の場合はshowにコメントを羅列して、そこのポストにいいね!ボタンをつける)
<現状>
しかし、ユーザーがいいねをすると、そのページにある全てのポストにいいねしたことになってしまい、各ポストについて独立していいねすることができません。これをなんとかしたいです。
<アプリの構造>
Commentモデル(name:string) userモデル(name:string) postモデル(content:text) likeモデル(post_id:integer, user_id:integer)といった感じです。各モデルにはコントローラが存在しています。
commentコントローラのshowの各ページにフォームが用意されており、postコントローラのクリエイトでコメントを生成して、コメントコントローラのshowページで表示するようにしています。

comment.html.erb

<% provide(:title, @comment.name+"のページ") %> <h1><%= @comment.name %>について何かを書こう!</h1> <% @posts.each do |post| %> <div class="posts-index-item"> <strong>『<%= post.content %>』</strong> <% if Like.find_by(user_id: @current_user.id, post_id: post.id) %> <<%= link_to("/likes/#{post.id}/destroy", {method: "post"}) do %> <span class="fa fa-heart like-btn-unlike"></span> <% end %> <% else %> <%= link_to("/likes/#{post.id}/create", {method: "post"}) do %> <span class="fa fa-heart like-btn"></span> <% end %> <% end %> <%= @likes_count %> <p align=right><%= post.created_at %></p> </div> <% end %> <% if logged_in? %> <h1>投稿する</h1> <%= form_tag("/posts/create") do %> <textarea name="content"></textarea> <%= hidden_field_tag "comment_id", @comment.id %> <input type="submit" value="投稿"> <% end %> <% else %> <h3><%= link_to "投稿するにはログインが必要です", login_path %></h3> <% end %>

commentコントローラ

class CommentsController < ApplicationController def show @comments = Comment.find_by(id: params[:id]) @posts = Post.where(comment_id: @comment.id) @current_user = User.find_by(id: session[:user_id]) @post = Post.find_by(id: params[:id]) @likes_count = Like.where(post_id: @post.id).count end end

likesコントローラ

class LikesController < ApplicationController def create @like = Like.new(user_id: @current_user.id, post_id: params[:post_id]) @like.save redirect_to("/posts/#{params[:post_id]}") end def destroy @like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id]) @like.destroy redirect_to("/posts/#{params[:post_id]}") end end

postコントローラ

class PostsController < ApplicationController def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) @likes_count = Like.where(post_id: @post.id).count end def new end def create @post = Post.new(content: params[:content], user_id: @current_user.id, comment_id: params[:comment_id]) @post.save redirect_to("/help") end end

足りない情報があれば追加します。
よろしくお願いいたします。

Rails.application.routes.draw do post "likes/:post_id/create" => "likes#create" post "likes/:post_id/destroy" => "likes#destroy" get "posts/index" => "posts#index" get "posts/new" => "posts#new" get "posts/:id" => "posts#show" post "posts/create" => "posts#create" get 'comments/index' get 'comments/:id' => 'comments#show' root 'static_pages#home' get '/help', to: 'static_pages#help' get '/configuration', to: 'static_pages#configuration' get '/about', to: 'static_pages#about' get '/contact', to: 'static_pages#contact' get '/top', to: 'static_pages#top' get '/signup', to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' get '/:city/:banti', to: 'comments#index' resources :users do member do get :following, :followers end end resources :account_activations, only: [:edit] resources :password_resets, only: [:new, :create, :edit, :update] resources :microposts, only: [:create, :destroy] resources :relationships, only: [:create, :destroy] end

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

scivola
scivola

2018/02/13 03:50

config/routes\.rb を見せてもらえますか。
ninpig04
ninpig04

2018/02/13 12:06

情報を追加しましたよろしくお願いいたします
kentos
kentos

2018/02/14 03:54 編集

確認です。 通常CommentにLikeできる場合、Likeのカラムはuser_idとcomment_idになると思います。そこに誤記や勘違いはありませんか? この確認自体わけがわからない場合は、そうおっしゃってください。
ninpig04
ninpig04

2018/02/14 05:39

Commentというのはページの名前で別にCityとかschoolとかなんでもいいんです。そこに投稿された、ポストにライクできるようにしてあるのでライクのカラムはuser_idとpost_idにしてあります。すみません、少し混乱していますがここに間違いはありません。
ninpig04
ninpig04

2018/02/14 05:41

本文がたしかに紛らわしかったので修正しました
kentos
kentos

2018/02/14 05:46 編集

確認ありがとうございます。「そのコメントにいいねをつけられるようにしたいと考えています」と文章にありますが、この「コメント」はモデルでいうとPostということでしょうか?修正確認しました。ありがとうございます。
ninpig04
ninpig04

2018/02/14 06:29 編集

そうです!Postです。本当に紛らわしくてすみません、修正します。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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