Open1

docker+rails+postgresqlでいいね機能追加

pipopipo

DBにテーブル作成

docker-compose run web rails g model Like user_id:integer post_id:integer

docker-compose run web rails db:migrate

schema.rbに更新されたことを確認

schema.rb
  create_table "likes", force: :cascade do |t|
    t.integer "user_id"
    t.integer "post_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

あっ。カラム名間違えてました。

docker-compose run web rails g migration rename_post_id_column_to_like
20230203051916_rename_post_id_column_to_likes.rb
class RenamePostIdColumnToLikes < ActiveRecord::Migration[7.0]
  def change
    rename_column :likes, :post_id, :tweet_id
  end
end

migrateして再起動

docker-compose run web rails db:migrate

docker-compose up

バリデーション追加

like.rb
class Like < ApplicationRecord
    validates :user_id, {presence: true}
    validates :tweet_id, {presence: true}
end

カラムの名前と型間違えていたのでこちらで修正↓
https://zenn.dev/pipokei/scraps/b89a6307e93f5c


ルートを作成

routes.rb
  #いいね
  post '/likes/:tweet_id/create', to: 'likes#create'
  delete '/likes/:tweet_id/destroy', to: 'likes#destroy'
index.html.slim
= render partial: 'form', locals: { tweet: @tweet }
.tweet_index
    - @tweets.each do | tweet |
        .tweet_box
            - @tweets_user = User.find_by(id: tweet.user_id)
            .img_box
                = image_tag @tweets_user.image , :style => 'max-height: 80px; max-width: 100px'  if @tweets_user.image.attached?
            .arrow_box
                = tweet.content
                .child_flam
                    - if Like.find_by(user_id: @current_user.id, tweet_id: tweet.id)
                        = link_to "/likes/#{tweet.id}/destroy", method: :delete do 
                            span.heart
                    - else 
                        = link_to "/likes/#{tweet.id}/create", method: :post do
                            span.heart_no
                .child_flam
                    - if @current_user.id ==  tweet.user_id.to_i
                        = link_to '削除', tweet, method: :delete, data: { confirm: "つぶやきを削除します。よろしいですか?"} ,class: 'btn-delete'
                    = tweet.created_at
likes_controller.rb
class LikesController < ApplicationController
    before_action :current_user
    def create
        @tweet_id = params[:tweet_id]
        @like = Like.new(user_id: @current_user.id ,tweet_id: params[:tweet_id])
        if @like.save
            redirect_to tweets_path, notice: "いいねしました"
        end
    end

    def destroy
        @like = Like.find_by(user_id: @current_user.id, tweet_id: params[:tweet_id])
        if @like.destroy
            redirect_to tweets_path, notice: "いいね消しました"
        end
    end
end

以上で画面動きました。