前提・実現したいこと
いいね機能の非同期通信を「remote:true」を使用して実装しようとしています。
destroyまでは反応するようになったのですが、createがどうしてもわからない状況です。
大変申し訳ないのですが教えていただけませんでしょうか?
発生している問題・エラーメッセージ
ターミナルで非同期createを実行すると下記のようにjob_idgが見つからないとエラー表示されるように思います。
コントローラの18行目あたりのset_tweetを修正するよう指示もあるので見てみました。
ActiveRecord::RecordNotFound (Couldn't find Job with 'id'=21):
app/controllers/favorites_controller.rb:18:in `set_tweet'
Started DELETE "/jobs/8/favorites" for ::1 at 2020-09-27 02:08:40 +0900 Processing by FavoritesController#destroy as JS Parameters: {"job_id"=>"8"} User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 Job Load (0.4ms) SELECT `jobs`.* FROM `jobs` WHERE `jobs`.`id` = 8 LIMIT 1 ↳ app/controllers/favorites_controller.rb:18:in `set_tweet' Favorite Load (0.4ms) SELECT `favorites`.* FROM `favorites` WHERE `favorites`.`user_id` = 2 AND `favorites`.`job_id` = 8 LIMIT 1 ↳ app/controllers/favorites_controller.rb:11:in `destroy' (0.2ms) BEGIN ↳ app/controllers/favorites_controller.rb:12:in `destroy' Favorite Destroy (0.6ms) DELETE FROM `favorites` WHERE `favorites`.`id` = 21 ↳ app/controllers/favorites_controller.rb:12:in `destroy' (1.0ms) COMMIT ↳ app/controllers/favorites_controller.rb:12:in `destroy' Rendering favorites/destroy.js.haml Favorite Exists? (0.6ms) SELECT 1 AS one FROM `favorites` WHERE `favorites`.`user_id` = 2 AND `favorites`.`job_id` = 21 LIMIT 1 ↳ app/models/user.rb:16:in `already_favorited?' Rendered matches/_favorite.html.haml (Duration: 3.2ms | Allocations: 921) Rendered favorites/destroy.js.haml (Duration: 5.6ms | Allocations: 2512) Completed 200 OK in 22ms (Views: 5.9ms | ActiveRecord: 3.8ms | Allocations: 8273) Started POST "/jobs/21/favorites" for ::1 at 2020-09-27 02:08:44 +0900 Processing by FavoritesController#create as JS Parameters: {"job_id"=>"21"} User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 Job Load (0.4ms) SELECT `jobs`.* FROM `jobs` WHERE `jobs`.`id` = 21 LIMIT 1 ↳ app/controllers/favorites_controller.rb:18:in `set_tweet' Completed 404 Not Found in 7ms (ActiveRecord: 1.1ms | Allocations: 2741) ActiveRecord::RecordNotFound (Couldn't find Job with 'id'=21): app/controllers/favorites_controller.rb:18:in `set_tweet'
該当のソースコード
controllers/favorites_controller.
ruby
1class FavoritesController < ApplicationController 2 before_action :authenticate_user! 3 before_action :set_tweet 4 5 def create 6 @favorite = current_user.favorites.create(job_id: @job.id) 7 # redirect_back(fallback_location: root_path) 8 end 9 10 def destroy 11 @favorite = current_user.favorites.find_by(job_id: @job.id) 12 @favorite.destroy 13 # redirect_back(fallback_location: root_path) 14 end 15 16 private 17 def set_tweet 18 @job = Job.find(params[:job_id]) 19 end 20end
部分テンプレートのソースコード
_favorite.html.haml
ruby
1-if user_signed_in? 2 -if current_user.already_favorited?(match) 3 = link_to job_favorites_path(match.id), method: :delete, remote: true do 4 = icon('fas', 'star', class: "Job-catch__box--star--color") 5 - else 6 = link_to job_favorites_path(match.id), method: :post, remote: true do 7 = icon('far', 'star')
jsファイルのソースコード
create.js.haml / destroy.js.haml
js
1('.Job-catch__box--star').html("#{escape_javascript(render partial: "matches/favorite", locals: { match: @favorite })}");
render付近のソースコード
部分テンプレートの状況からさらに、js処理をしたい部分をrenderで部分テンプレートしています。
ruby
1 .Bar-left__middle 2 - matches.each do |match| 3 .Job-box 4 .Upper-job 5 .Upper-job__new 6 NEW 7 .Upper-job__no 8 job.no eeeeeeee 9 .Job-catch 10 .Job-catch__textarea 11 .Job-catch__textarea--text 12 =match.title 13 .Job-catch__box 14 .Job-catch__box--star 15 = render partial: "favorite", locals: { match: match } 16 .Job-catch__box--text
試したこと
色々と記事を読んでいますと部分テンプレートでrenderする時に下記のようにidと該当のjob_idを設定し、jsファイルも同じように設定してみましたがエラーになってしまいます。。。何卒よろしくお願いします。
ruby
1.Job-catch__box--star 2 %div{id: "job_favorite_#{match.id}"} 3 = render partial: "favorite", locals: { match: match }
terminal
1 2ActionView::Template::Error (undefined local variable or method `match' for #<#<Class:0x00007f9f738101e0>:0x00007f9f86e31a70> 3Did you mean? catch): 4 1: $("#job_favorite_#{match.id}").html("#{escape_javascript(render partial: "matches/favorite", locals: { match: @favorite })}"); 5 6app/views/favorites/create.js.haml:1 7
足情報(FW/ツールのバージョンなど)
ruby
1ruby '2.6.5' 2 3# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 4gem 'rails', '~> 6.0.0' 5# Use mysql as the database for Active Record 6gem 'mysql2', '>= 0.4.4' 7# Use Puma as the app server 8gem 'puma', '~> 3.11' 9# Use SCSS for stylesheets 10gem 'sass-rails', '~> 5' 11# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker 12gem 'webpacker', '~> 4.0' 13# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks 14gem 'turbolinks', '~> 5' 15# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 16gem 'jbuilder', '~> 2.7' 17省略 18 19gem 'jquery-rails' 20
あなたの回答
tips
プレビュー