rails でコンテンツを投稿し、各コンテンツの詳細画面に非同期で「いいね機能」を作っています。
------------起きている問題------------
コンテンツ詳細画面を開く
ボタン状態:未いいね
↓ いいね押す(createされるがレンダリングしない) ※ここが問題点
ボタン状態:未いいね
↓ リロードしてみる
ボタン状態:いいね済
↓いいね押す(destroyされ、レンダリングされる)
ボタン状態:未いいね
---------繰り返し---------
発生している問題・エラーメッセージ
ActionView::Template::Error (No route matches {:action=>"destroy", :content_id=>5, :controller=>"user/favorites"}, missing required keys: [:id]): 1: <% if content.liked_by?(current_user) %> 2: <%= button_to content_favorite_path(content.id), method: :delete, remote: true, class:"buy-btn fav-delete-btn" do %> 3: <span>いいね解除</span> 4: <% end %> 5: <% else %> app/views/user/favorites/_favorite.html.erb:2 app/views/user/favorites/create.js.erb:1
routes.rb
Ruby
1authenticated :user do 2 scope module: :user do 3 resources :contents, only: [:index, :new, :create, :show, :destroy] do 4 resources :favorites, only: [:create, :destroy] 5 end 6 end 7end
model
content.rb
Ruby
1class Content < ApplicationRecord 2 belongs_to :user 3 has_many :favorites, dependent: :destroy 4 5 validates :user_id, presence: true 6 7 def liked_by?(user) 8 favorites.where(user_id: user.id).exists? 9 end 10end
user.rb
Ruby
1class User < ApplicationRecord 2 has_many :contents, dependent: :destroy 3 has_many :favorites, dependent: :destroy 4end
favorite.rb
Ruby
1class Favorite < ApplicationRecord 2 belongs_to :user 3 belongs_to :content 4 validates :user_id, uniqueness: { scope: :content_id } 5end
###favorites_controller.rb
Ruby
1(app/controllers/user/favorites_controller.rb) 2 3class User::FavoritesController < ApplicationController 4 before_action :set_variables 5 6 def create 7 @favorite = current_user.favorites.create(content: @content) 8 end 9 10 def destroy 11 favorite = Favorite.find_by(content: @content, user_id: current_user.id) 12 favorite.destroy 13 end 14 15 private 16 17 def set_variables 18 @content = Content.find(params[:content_id]) 19 @id_name = "#favorites_buttons_#{@content.id}" 20 end 21end
###show.html.erb
(app/views/user/contents/show.html.erb) <div id="favorites_buttons_<%= @content.id %>"> <%= render partial: 'user/favorites/favorite', locals: { content: @content} %> </div>
###_favorite.html.erb
(app/views/user/favorites/_favorite.html.erb) <% if content.liked_by?(current_user) %> <%= button_to content_favorite_path(content.id), method: :delete, remote: true, class:"buy-btn fav-delete-btn" do %> <span>いいね解除</span> <% end %> <% else %> <%= button_to content_favorites_path(content.id), method: :post, remote: true, class:"buy-btn fav-btn" do %> <span>いいね!</span> <% end %> <% end %>
###create.js.erb destroy.js.erb
(app/views/user/favorites/create.js.erb) (app/views/user/favorites/destroy.js.erb) $('<%= @id_name %>').html("<%= j(render partial: 'user/favorites/favorite', locals: {content: @content}) %>");
試したこと
ルーティングがネスト構造になっているため、viewファイルの位置がおかしいのかと思い、フォルダー作ったり、ファイルを移動させたりしたのですが、解決できませんでした。。。
回答1件
あなたの回答
tips
プレビュー