railsでいいね機能を付けたのですがうまくいいねが追加されません。
記事の一覧からいいねをクリックするとこのようなエラーが出てしまいます。
@postには記事のIDが入っていてそれを現在のユーザーのfavoritesにしまうと思うのですが@favoritesというインスタンス変数がいまいちわかりません。このbuildを使うと@favoriteの中に現在のユーザーのお気に入りのポストという感じに作られるイメージなのですが合っているでしょうか?
このコードで動くはずなのですがrailsを始めたばかりなのでイメージが薄くエラーが取れないです。助けて下さいお願いします。
追記:
routes.rb
Rails.application.routes.draw do
get 'users/index'
get 'users/show'
devise_for :users
resources :users, only: [:index, :show] do
get :favorites, on: :member
end
resources :posts do
resources :favorites, only: [:create, :destroy]
end
root 'posts#index'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
favorite.rb
class Favorite < ApplicationRecord
class Favorite < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
#追記2:以下のuserとpostのpresenceをコメントアウトしたらうまく動いたのですが
#userとpostが空でエラーが出ていたみたいなのですが空でいいのでしょうか?
validates :user, presence: true
validates :user_id, uniqueness: { scope: :post_id }
validates :post, presence: true
end
post.rb
class Post < ApplicationRecord
belongs_to :user
mount_uploader :image, ImageUploader
acts_as_ordered_taggable_on :interests
has_many :favorites, dependent: :destroy
def favorited_by? user
favorites.where(user_id: user.id).exists?
end
end
user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :posts
has_many :favorites, dependent: :destroy
end
class FavoritesController < ApplicationController
before_action :authenticate_user!
def create
@post = Post.find(params[:post_id])
#追記1:以下のpost:とpost_id:に変更したら上の画像の別のエラーが出ました。
@favorite = current_user.favorites.build(post_id: @post)
if @favorite.save
redirect_to posts_url, notice: "お気に入りに登録しました"
else
redirect_to posts_url, alert: "この投稿はお気に入りに登録できません"
end
end
def destroy
@favorite = current_user.favorites.find_by!(post_id: params[:post_id])
@favorite.destroy
redirect_to posts_url, notice: "お気に入りを解除しました"
end
end
favoriteテーブル
class CreateFavorites < ActiveRecord::Migration[5.0]
def change
create_table :favorites do |t|
t.integer :user_id
t.integer :post_id
t.timestamps
end
end
end