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

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

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

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

Ajax

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

Q&A

解決済

1回答

2591閲覧

ActionView::Template::Errorが解決できません

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 04:57

前提・実現したいこと

ruby on rails 6でSNSアプリを製作中、いいね機能をajaxを用いてサーバーと非同期で実装しようとしたところ、いいねの取り消しは非同期で実装できたのですが、いいねをする機能が非同期では実装できず、ブラウザをリロードしなければいいねができない状況です。サーバーのログには下記のActionView::Template::Errorが表示されてしまいました。

どこが原因かわからないのでコードをいかに載せておきます。。
宜しくお願いします。
質問などもあればよろしくお願いします。

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

サーバーのログに表示されているエラー

ActionView::Template::Error (No route matches {:action=>"destroy", :book_id=>#<Book id: 302, title: "本1", author: "著者1", publisher: "出版社1", publish_year: 2000, user_id: 1, created_at: "2020-09-05 04:43: 3", updated_at: "2020-09-05 04:43:33", comment: "とても素晴らしい本です。\r\n">, :controller=>"likes"}, missing required keys: [:id]): 1: <%= form_with(url: book_like_path(@book), html: { method: :delete }, remote: true) do |f| %> 2: <%= f.submit "いいねを取り消す", class: "btn" %> 3: <% end %> app/views/likes/_unlike.html.erb:1 app/views/likes/create.js.erb:1

ブラウザのデベロッパーツールに表示されているエラー

POST https://12dac388e20f4c1f9f6629019404d368.vfs.cloud9.us-east-2.amazonaws.com/books/302/likes 500

該当のソースコード

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] end resources :relationships, only: [:create, :destroy] end

users/show.html.erbにいいねのフォームがあります

<div id="like_form"> <% if current_user.already_liked?(@book) %> <%= render 'likes/unlike' %> <% else %> <%= render 'likes/like' %> <% end %> </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), html: { method: :delete }, remote: true) do |f| %> <%= f.submit "いいねを取り消す", class: "btn" %> <% 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

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')) %>");

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

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

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

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

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

guest

回答1

0

ベストアンサー

likes/_unlike.html.erb

erb

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

↑の部分ですが、 book_like_path はどの Like を消すのか、という情報が必要なので、

  • book_like_path(@book, @like) # Controller でそのユーザーの @like を設定

のようにパスを指定する必要があるかと思います

投稿2020/09/05 06:20

編集2020/09/05 06:23
unhappychoice

総合スコア1531

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

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

Asahi_sun_

2020/09/05 08:19

回答ありがとうございます! その通りでした。。 無事解決しました。ありがとうございます!!
Asahi_sun_

2020/09/05 08:42

すみません、次は、すでにいいねをしている状態でbooks/show.html.erbに移動すると、そのいいねのidがmissing required keys: [:id]となってしまいます。泣 likeコントローラーのdestroyアクションで @like = Like.find_by(book_id: params[:book_id], user_id: current_user.id) と定義しているのですがこれではidが見つけられないのでしょうか。。
unhappychoice

2020/09/05 08:46 編集

Like model や BooksController の実装を見ないとなんとも言えないので、別質問にするのが良いかと思いますmm
Asahi_sun_

2020/09/05 08:48

分かりました。m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問