Twitterクローンを作っている途中です。
「お気に入り追加・削除」のボタンが設置したいのですが、パーシャルファイルを作成し、ボタンを設置しようとしたところでエラーが出てしまったため質問しました。
調べた結果、 favorites/_favorite_buttonのファイルがないといわれているようですが、ファイルがあるのになぜこのエラーが出たのかわからず、躓いてしまいました。
発生している問題・エラーメッセージ
### エラーが発生しているコード
views/micropost/_microposts.html.erb
<ul class="list-unstyled"> <% microposts.each do |micropost| %> <li class="media mb-3"> <img class="mr-2 rounded" src="<%= gravatar_url(micropost.user, { size: 50 }) %>" alt=""> <div class="media-body"> <div> <%= link_to micropost.user.name, user_path(micropost.user) %> <span class="text-muted">posted at <%= micropost.created_at %></span> </div> <div> <% if current_user == micropost.user %> <%= link_to "Delete", micropost, method: :delete, data: { confirm: "You sure?" }, class: 'btn btn-danger btn-sm' %> <% end %> <%= render 'favorites/favorite_button', micropost: @micropost %> </div> <div> <p><%= micropost.content %></p> </div> </div> </li> <% end %> <%= paginate microposts %> </ul>
「お気に入り機能」を追加するときに書いたソースコード
db/migrate/20201012042419_create_favorites.rb
class CreateFavorites < ActiveRecord::Migration[5.2] def change create_table :favorites do |t| t.references :user, foreign_key: true t.references :micropost, foreign_key: true t.timestamps t.index [:user_id, :micropost_id], unique: true end end end
models/favorite.rb
class Favorite < ApplicationRecord belongs_to :user belongs_to :micropost end
user.rb
class User < ApplicationRecord before_save { self.email.downcase! } validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, uniqueness: { case_sensitive: false } has_secure_password has_many :microposts has_many :relationships has_many :followings, through: :relationships, source: :follow has_many :reverses_of_relationship, class_name: 'Relationship', foreign_key: 'follow_id' has_many :followers, through: :reverses_of_relationship, source: :user has_many :favorites has_many :likes, through: :favorites, source: :micropost <中略> #お気に入り機能 def favorite(micropost) self.favorites.find_or_create_by(micropost_id: micropost.id) end def unfavorite(micropost) favorite = self.favorites.find_by(micropost_id: micropost.id) favorite.destroy if favorite end def likes?(micropost) self.likes.include?(micropost) end end
config/routes.rb
Rails.application.routes.draw do root to: 'toppages#index' get 'login', to: 'sessions#new' post 'login', to: 'sessions#create' delete 'logout', to: 'sessions#destroy' get 'signup', to: 'users#new' resources :users, only: [:index, :show, :new, :create] do member do get :followings get :followers get :likes end end resources :microposts, only: [:create, :destroy] resources :relationships, only: [:create, :destroy] resources :favorites, only: [:create, :destroy] end
controller/favorites_controller.rb
class FavoritesController < ApplicationController before_action :require_user_logged_in def create micropost = Micropost.find(params[:micropost_id]) current_user.favorite(micropost) flash[:success] = 'お気に入りに追加しました。' redirect_to user end def destroy micropost = Micropost.find(params[:micropost_id]) current_user.unfavorite(micropost) flash[:success] = 'お気に入りから削除しました。' redirect_to user end end
views/favorites/_favorite_button_html.erb
<% if current_user.likes?(micropost) %> <%= form_with(model: current_user.favorites.find_by(micropost_id: micropost.id), local: true, method: :delete) do |f| %> <%= hidden_field_tag :micropost_id, micropost.id%> <%= f.submit 'Unfavorite', class: 'btn btn-danger btn-block' %> <% end %> <% else %> <%= form_with(model: current_user.favorites.build, local: true) do |f| %> <%= hidden_field_tag :micropost_id, micropost.id %> <%= f.submit 'Favorite', class: 'btn btn-primary btn-block' %> <% end %> <% end %>
お願い
足りないソースコードがあれば載せます。
アドバイスをよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。