66725


お世話になっております。  
下記の問題に対して知見がある方がいらっしゃいましたらご教示お願いします。

# 起きている問題

いいね機能を実装中にエラーが発生しました。  

[code]

    # _like.html.erb
    
    <% if @post.liked_by?(current_user) %>
      <%= button_to 'いいね解除', post_like_path(@post), method: :delete, remote: true %>
    <% else %>
      <%= button_to 'いいね', post_likes_path(@post), method: :post, remote: true %>
    <% end %>
    
[/code]

いいねボタンを押したときに起きました。  
更新ボタンを押すと正常に`likes.count`が１つ足されているので（いいねされている）`Ajax`に何か問題があるのでしょうか。  
また、いいねされている状態であると正常にいいね解除できます。

# アプリケーションの挙動

１、いいねされていない状態でいいねボタンをクリック  
[![画像の説明をここに入力](https://i.stack.imgur.com/OV6W9.png)](https://i.stack.imgur.com/OV6W9.png)クリック  
⬇️  
エラー発生  
[![画像の説明をここに入力](https://i.stack.imgur.com/izcs6.png)](https://i.stack.imgur.com/izcs6.png)  
⬇️  
更新ボタンを押下  
[![画像の説明をここに入力](https://i.stack.imgur.com/uCMi8.png)](https://i.stack.imgur.com/uCMi8.png)正常に稼働する

２、いいねされている状態でいいねボタンをクリック  
[![画像の説明をここに入力](https://i.stack.imgur.com/LDAiu.png)](https://i.stack.imgur.com/LDAiu.png)  
⬇︎  
[![画像の説明をここに入力](https://i.stack.imgur.com/jkSvn.png)](https://i.stack.imgur.com/jkSvn.png)正常に稼働する

# 関連ファイル

[code]

    #likes/_like.html.erb
    
    <% if @post.liked_by?(current_user) %>
      <%= button_to 'いいね解除', post_like_path(@post), method: :delete, remote: true %>
    <% else %>
      <%= button_to 'いいね', post_likes_path(@post), method: :post, remote: true %>
    <% end %>
    
[/code]

[code]

    #likes/destroy.js.erb
    
    $('.like_button').html("<%= j(render 'likes/like' , post: @post) %>");
    
[/code]

[code]

    #likes/create.js.erb
    
    $('.like_button').html("<%= j(render 'likes/like' , post: @post) %>");
    
[/code]

[code]

    #posts/show.html.erb
    
    <% provide(:title, '投稿詳細画面') %>
    <div class="row">
        <div class="title"><p>投稿詳細画面</p></div>
     <div class="col-md-2">
     </div>
    <div class="col-md-8">
      <%= render 'static_pages/show', post: @post %>
    </div>
    <div class="col-md-2">
    </div>
    </div>
    
[/code]

[code]

    #static_pages/_show.html.erb
    
    <div class="Allpost">
        <div class="showAllpost_detail">
         <div class="Post_image">
          <%= image_tag @post.image, :size =>'350x250'%>
    
          <div class="like_button">
    <%= render 'likes/like' , post: @post%>
    </div>
    :
    （省略）
    :
    
[/code]

[code]

    #models/post.rb
    
    class Post < ApplicationRecord
    :
    (省略)
    :
     def liked_by?(user)
        likes.where(user_id: user.id).exists?
      end
    end
    
[/code]

[code]

    #controllers/likes_controller.rb
    
    class LikesController < ApplicationController
      protect_from_forgery except: %i[create destroy]
      before_action :set_post
      def create
        @post = Post.find(params[:post_id])
        @like = current_user.likes.new(post_id: params[:post_id])
        @like.save
      end
    
      def destroy
        @post = Post.find(params[:post_id])
        @like = Like.find_by(post_id: params[:post_id], user_id: current_user.id)
        @like.destroy
      end
    
      private
    
      def set_post
        @post = Post.find(params[:post_id])
      end
    end
    
[/code]

[code]

    #config/routes.rb
    # frozen_string_literal: true
    
    Rails.application.routes.draw do
      get 'maps/index'
    
      root 'maps#index'
      get  '/signup', to: 'users#new'
      get    '/login',   to: 'sessions#new'
      post   '/login',   to: 'sessions#create'
      delete '/logout',  to: 'sessions#destroy'
      get '/test_login', to: 'users#test_login'
      post '/posts', to: 'posts#confirm'
      post '/post/create', to: 'posts#create'
      get 'post/:id', to: 'posts#show'
      get '/map_request', to: 'maps#map', as: 'map_request'
      get '/map', to: 'posts#map'
      resources :maps, only: [:index, :create]
      resources :users do
        member do
          get :following, :followers
        end
      end
    
      resources :account_activations, only: [:edit]
      resources :password_resets,     only: %i[new create edit update]
      resources :posts do
        resources :likes, only: %i[destroy create]
      end
      resources :relationships, only: %i[create destroy]
    end
    
[/code]

# 環境

Rails 5.1.6  
Ruby 2.5.1


CC BY-SA 4.0
2020-04-24T09:29:14.530
65925
2020-05-17T18:31:13.303
2020-06-17T08:14:45.997
-1
question
ruby-on-rails ajax
No route matches


`likes/_like.html.erb`の

[code]

    <%= button_to 'いいね解除', post_like_path(@post), method: :delete, remote: true %>
    
[/code]

を

[code]

    <%= button_to 'いいね解除', post_like_path(@post, Like.find_by(post: @post, user: current_user)), method: :delete, remote: true %>
    
[/code]

のように修正してみてください（実際には `Like.find_by`の部分はモデルクラスに書いたほうがいいでしょう）。

* * *

ここで、削除したいのはLikeなので、LikeのIDを渡さないと削除のURLが呼べなくなっています。


CC BY-SA 4.0
2020-05-17T18:31:13.303
66725
2020-05-17T18:31:13.303
442
65925
answer