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

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

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

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

2268閲覧

missing required keys: [:id]の解決方法が分からない

Asahi_sun_

総合スコア5

Ruby on Rails 6

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/09/05 09:05

編集2020/09/05 09:31

前提・実現したいこと

rails6 でSNSを製作中、いいね機能をajaxで非同期で実装しようとしています。
いいねのフォームはbook(投稿)のshowページにあるのですが、いいねをすでにしている状態でbookのshowページに戻ると、すでにしてあるいいねのidを見つけられずに、以下のエラーが出てしまいます。

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

ActionView::Template::Error (No route matches {:action=>"destroy", :book_id=>"301", :controller=>"likes", :id=>nil}, missing required keys: [:id]): 1: <%= form_with(url: book_like_path(@book, @like), html: { method: :delete }, remote: true) do |f| %> 2: <%= f.submit "いいねを取り消す", class: "btn" %> 3: <% end %>

該当のソースコード

usersコントローラ

def show @user = User.find(params[:id]) @books = @user.books.paginate(page: params[:page]) @like = Like.new end

booksコントローラ

def show @book = Book.find(params[:id]) @like = Like.new @comments = @book.comments @comment = Comment.new end

likesコントローラ

class LikesController < ApplicationController def create @book = Book.find(params[:book_id]) @like = current_user.likes.create(book_id: params[:book_id]) respond_to do |format| format.html { redirect_to @book } format.js end end def destroy @book = Book.find(params[:book_id]) @like = Like.find_by(book_id: params[:book_id], user_id: current_user.id) @like.destroy respond_to do |format| format.html { redirect_to @book } format.js end end end

books/show.html.erb

<div class="liked_users"> <div id="like_form"> <% if current_user.already_liked?(@book) %> <%= render 'likes/unlike' %> <% else %> <%= render 'likes/like' %> <% end %> </div> <p> いいね <strong id="likes_count"> <%= @book.likes.count %> </strong> 件 </p> <div id="liked_by"> <%= render 'liked_users' %> </div>

likes/_like.html.erb

<%= form_with(url: book_likes_path(@book), remote: true) do |f| %> <%= f.submit "いいね", class: "btn" %> <% end %>

likes/_unlike.html.erb

<%= form_with(url: book_like_path(@book, @like), html: { method: :delete }, remote: true) do |f| %> <%= f.submit "いいねを取り消す", class: "btn" %> <% end %>

likes/create.js.erb

$("#like_form").html("<%= escape_javascript(render('likes/unlike')) %>"); $("#likes_count").html('<%= @book.likes.count %>'); $("#liked_by").html("<%= escape_javascript(render('books/liked_users')) %>");

likes/destroy.js.erb

$("#like_form").html("<%= escape_javascript(render('likes/like')) %>"); $("#likes_count").html('<%= @book.likes.count %>'); $("#liked_by").html("<%= escape_javascript(render('books/liked_users')) %>");

Like model

class Like < ApplicationRecord belongs_to :book belongs_to :user validates_uniqueness_of :book_id, scope: :user_id end

※追記
routes.rb

Rails.application.routes.draw do root 'static_pages#home' get '/home', to: 'static_pages#home' get '/help', to: 'static_pages#help' get '/signup', to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :books, only: [:show, :create, :destroy] do resources :likes, only: [:create, :destroy] resources :comments, only: [:create] end resources :relationships, only: [:create, :destroy] end

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

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

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

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

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

Cojiro

2020/09/05 09:24

routes.rbを記載してください。
guest

回答1

0

ベストアンサー

booksコントローラ

def show @book = Book.find(params[:id]) @like = Like.new @comments = @book.comments @comment = Comment.new end

@like = Like.find_by(book: @book, user: current_user) || Like.new

なのかと思いましたmm
(すでにある場合に Like を取得できてないので

投稿2020/09/05 09:29

unhappychoice

総合スコア1531

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問