ecサイトを作成中の者です。Ajax対応した動作を追加したく質問させていただきました。
使用箇所はお気に入り機能です。現在Ajax無しでの動作はお気に入り追加のボタンがありまして、そこを押すとお気に入りに追加されredirect_to root_pathでページが切り替わり、お気に入り追加ボタンが解除ボタンに変わっているというものです。この動作が少し遅いのと、ページ全体が切り替わるのが嫌だったので今回Ajaxに対応させようと思いました。
実は現在カートに商品を追加するという機能にはAjax対応できています。ですがお気に入りの方がうまくいかないので質問させていただきました。
カートの方で使ったやり方を参考に施行錯誤していたのですがうまくいきませんでした。以下コードとエラーを載せます
ターミナルでお気に入り追加した際のエラー文
(5.0ms) commit transaction Rendering favorites/create.js.erb Rendered favorites/create.js.erb (92.7ms) Completed 500 Internal Server Error in 233ms (ActiveRecord: 14.3ms) ActionView::Template::Error (Missing partial favorites/_favorite with {:locale=>[:en], :formats=>[:js, :html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in: * "/vagrant/depot-study/app/views" ): 1: $("#notice").hide(); 2: $('#fav_js').html("<%=j render @favorite %>"); app/views/favorites/create.js.erb:2:in `_app_views_favorites_create_js_erb___975853424_79455600'
お気に入りの解除を行った際のターミナルエラー文
Started DELETE "/products/25/favorites" for 10.0.2.2 at 2018-05-01 11:24:14 +0000 Processing by FavoritesController#destroy as JS Parameters: {"product_id"=>"25"} User Load (1.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]] CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]] Favorite Load (2.3ms) SELECT "favorites".* FROM "favorites" WHERE "favorites"."user_id" = ? AND "favorites"."product_id" = ? LIMIT ? [["user_id", 7], ["product_id", 25], ["LIMIT", 1]] (0.1ms) begin transaction SQL (4.4ms) DELETE FROM "favorites" WHERE "favorites"."id" = ? [["id", 43]] (6.1ms) commit transaction No template found for FavoritesController#destroy, rendering head :no_content Completed 204 No Content in 1045ms (ActiveRecord: 14.8ms)
views/favorites/create.js.erb
$("#notice").hide(); $('#fav_js').html("<%=j render @favorite %>");
favorites_controller.rb
class FavoritesController < ApplicationController before_action :authenticate def create @product = Product.find(params[:product_id]) @favorite = current_user.favorites.build(product: @product) respond_to do |format| if @favorite.save format.html{redirect_to store_path, notice: "お気に入りに登録しました"} format.js format.json{head :ok} else format.html{redirect_to store_path, notice:"この商品はお気に入りに登録できません"} end end end def destroy @favorite = current_user.favorites.find_by!(product_id: params[:product_id]) @favorite.destroy respond_to do |format| format.html{redirect_to store_path, notice:"お気に入りを解除しました"} format.js end end end
views/store/index.html.erb
<div id="fav_js" class="store_button"> <% unless session[:user_id].nil? %> <% if product.favorited_by? current_user %> <%= link_to image_tag('no_fav.png', :size => "83x30"), product_favorites_path(product), remote: true ,method: :delete %> <% else %> <%= link_to image_tag('add_fav.png', :size => "83x30"), product_favorites_path(product), remote: true ,method: :post %> <% end %> <% end %> </div>
このような感じです。一応エラーが出ていますが、お気に入り追加や解除ボタン押した後にページ更新すると、押したことにはなっていました。
この場合どこがいけないのか全くわからないので、もしこちらご覧いただけた方で何かお気付きになられる方いましたらご教授の方よろしくお願いしますm(._.)m
正解だけでなく、ここは間違っているというご指摘だけでもとても参考になりますのでお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/02 10:48
2018/05/02 20:38 編集
2018/05/16 10:46