この度railsを用いて非同期いいねシステムを作ろうとしたのですが以下のようなエラーが発生してしまいました。
LikesController#create is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []
ソースコード
上図の青字は次の図の部分テンプレート
試しに、<%= link_to "/likes/#{post.id}/create", remote: true do %>を押してみたところ上図のようなエラーが出ました。ルーティング、コントローラー、js.erbファイルは下図
コントローラー
js.erbファイル
試してみたこと
下図のように変数postが悪さをしている要素を除外するためにjs.erbファイルの2行目をコメントアウトし、3行目を追加してみました。
ブラウザを開いて所、先ほどと同じエラーメッセージが出ました。このエラーは私のあてにならない予想では、「ビューがないよ!」と怒られている気がします。
いいねは保存できているようなのでcreateアクションには行っていると思います。
なぜこのようなエラーが生じるのでしょうか?ご教授お願いします。
10/19更新
ご回答のおかげにより以下のようなコードに書き換えさせていただいたところ、図2のようなエラー?が発生しました!
次からエラー?というか失敗画像
図1
/app/viws/likes/_likesの12行目をクリックしたところ図1から図2のようになりました!
このようになってしまいます”!!!
解決法はあるのでしょうか?!
ご教授お願いいたします!
ruby/Gamefile
1source "https://rubygems.org" 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby "3.2.2" 5 6# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" 7gem "rails", "~> 7.0.4", ">= 7.0.4.3" 8 9gem 'jquery-rails' 10 11gem 'bootstrap', '~> 4.4.1' 12 13gem 'googleauth' 14 15gem 'dotenv-rails' 16 17gem 'omniauth', '1.9.1' 18 19gem 'omniauth-google-oauth2' 20 21gem 'devise' 22 23# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] 24gem "sprockets-rails" 25 26# Use sqlite3 as the database for Active Record 27gem "sqlite3", "~> 1.4" 28 29# Use the Puma web server [https://github.com/puma/puma] 30gem "puma", "~> 5.0" 31 32# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] 33gem "importmap-rails" 34 35# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] 36gem "turbo-rails" 37 38# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] 39gem "stimulus-rails" 40 41# Build JSON APIs with ease [https://github.com/rails/jbuilder] 42gem "jbuilder" 43 44# Use Redis adapter to run Action Cable in production 45# gem "redis", "~> 4.0" 46 47# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] 48# gem "kredis" 49 50# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] 51# gem "bcrypt", "~> 3.1.7" 52 53# Windows does not include zoneinfo files, so bundle the tzinfo-data gem 54gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ] 55 56# Reduces boot times through caching; required in config/boot.rb 57gem "bootsnap", require: false 58 59# Use Sass to process CSS 60# gem "sassc-rails" 61 62# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] 63# gem "image_processing", "~> 1.2" 64 65group :development, :test do 66 # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem 67 gem "debug", platforms: %i[ mri mingw x64_mingw ] 68end 69 70group :development do 71 # Use console on exceptions pages [https://github.com/rails/web-console] 72 gem "web-console" 73 74 # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler] 75 # gem "rack-mini-profiler" 76 77 # Speed up commands on slow machines / big apps [https://github.com/rails/spring] 78 # gem "spring" 79end 80 81group :test do 82 # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] 83 gem "capybara" 84 gem "selenium-webdriver" 85 gem "webdrivers" 86end 87
JavaScript/app/javascript/application.js
1// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails 2 3 4import jQuery from "jquery"; 5window.$ = window.jQuery = jQuery; 6import("jquery-ui-dist") 7import("./custom/jQuery1.js") 8
JavaScript/app/javascript/custom/jQuery1.js
1$(function(){ 2 $(document).ready(function() { 3 $('#login-show').click(function(){ 4 $('#login-modal, #overlay').fadeIn(); 5 }); 6 $('#overlay, .close-modal').click(function(){ 7 $('#overlay, #login-modal').fadeOut(); 8 }); 9 }); 10}); 11 12$(function(){ 13 $(document).ready(function() { 14 $('#posted-show').click(function(){ 15 $('#posted-modal, #posted-overlay').fadeIn(); 16 }); 17 $('#posted-overlay, .close-modal').click(function(){ 18 $('#posted-overlay, #posted-modal').fadeOut(); 19 }); 20 }); 21}); 22 23$(function(){ 24 $(document).ready(function() { 25 $('.three-dot-leader').click(function(){ 26 $('.posted-detail, .posted-detail-overlay').fadeIn(); 27 }); 28 $('.posted-detail-overlay').click(function(){ 29 $('.posted-detail-overlay, .posted-detail').fadeOut(); 30 }); 31 }); 32}); 33 34const init = 4 //初期表示数 35const more = 4 //追加表示数 36 37// 初期表示数以降のリスト内容を非表示に 38$(".more-list div:nth-child(n+" + (init+1) + ")").hide() 39 40//初期表示数以下であればMoreボタンを非表示 41$(".more-list").filter(function(){ 42 return $(this).find("a").length <= init 43}).find(".more-btn").hide() 44 45// Moreボタンクリックで指定数表示 46$(".more-btn").on("click",function(){ 47 let this_list = $(this).closest(".more-list") 48 this_list.find("div:hidden").slice(0,more).slideToggle() 49 50 if(this_list.find("div:hidden").length == 0){ 51 $(this).fadeOut() 52 } 53}) 54 55// 3点リーダーを押したときその投稿のid保存 56 57 58// 削除項目出すやつ各々表示 59
ruby/app/config/importmap.rb
1# Pin npm packages by running ./bin/importmap 2 3pin "application", preload: true 4pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.6.0/dist/jquery.js" 5pin "jquery-ui-dist", to: "https://ga.jspm.io/npm:jquery-ui-dist@1.13.1/jquery-ui.js" 6pin_all_from 'app/javascript/custom', under: 'custom' 7
参考によろしくお願いします!!!
10/22更新
試しに<%= turbo %> 部分をコメントアウトしてみたのですが表示画面が同様に図2になりました泣
10/23更新
以下のサイトを参考にturboを用いてコードを書き換え図1のハートボタンを押したところ図3のようなビューに移行しました。
参考サイト
https://blog.aiandrox.com/posts/tech/2021/09/10/
https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/turbo-streams-fetch
変更したコード
erb/app/viws/likes/_likes
1<% if @posted %> 2 <% post = @posted %> 3<% end %> 4<%# turbo_stream.update :like_buttons do %> 5 <turbo_stream id="like_buttons"> 6 <% if Liker.find_by(content: session[:user_id],content2: post.id) %> 7 <%= link_to "/likes/#{post.id}/destroy" do %> 8 <span class="fa fa-heart liked-btn"></span> 9 <% end%> 10 <% else %> 11 <%# link_to "/likes/#{post.id}/create", remote: true do %> 12 <%# 下記リンクをクリックしたとき、`like_buttons ` という名前の Turbo Frame を更新する %> 13 <%= link_to "/likes/#{post.id}/create" do %> 14 <span class="fa fa-heart unliked-btn"></span> 15 <% end %> 16 <% end %> 17 <div> 18 <%= Liker.where(content2: post.id).count %> 19 </div> 20 </turbo-frame> 21<%# end %>
ruby/app/controllers/likescontroller
1class LikesController < ApplicationController 2 before_action :authenticate_user 3 def create 4 @posted = Posted.find_by(id: params[:post_id]) 5 @posts = Posted.all.order(created_at: :desc) 6 if !Liker.find_by(content: session[:user_id], content2: params[:post_id]) 7 @like = Liker.new( 8 content: session[:user_id], 9 content2: params[:post_id] 10 ) 11 @like.save 12 end 13 render turbo_stream: turbo_stream.update( 14 'like-buttons', 15 partial: 'likes/likes', 16 locals: { post: @posted} 17 ) 18 #format.html { render :_likes } 19 #render :_likes 20 end 21 22 def destroy 23 @like = Liker.find_by( 24 content: session[:user_id], 25 content2: params[:post_id] 26 ) 27 @like.destroy 28 redirect_to("/") 29 end 30 31end
10000字をオーバーするため質問を改めます
回答1件
あなたの回答
tips
プレビュー