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

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

ただいまの
回答率

90.53%

  • Ruby

    9229questions

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

  • Ruby on Rails

    8654questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 230

ninpig04

score 25

<やりたいこと>
現在各ページごとにユーザーが自由に意見を投稿できるサービスを作っています。
そのポストにいいねをつけられるようにしたいと考えています。
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ページで表示するようにしています。

<% 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 %>
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
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
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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • ninpig04

    2018/02/14 14:41

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

    キャンセル

  • kentos

    2018/02/14 14:41 編集

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

    キャンセル

  • ninpig04

    2018/02/14 15:28 編集

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

    キャンセル

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

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

  • Ruby

    9229questions

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

  • Ruby on Rails

    8654questions

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