[メモ] アソシエーション失敗 [未解決]
エラー概要
何回も同じエラーが出て前に進めないので、失敗した記述をメモ。
gift機能が実装できません。
やりたいこと
・giftsテーブルに値が保存される
gifts_table.rb
class CreateGifts < ActiveRecord::Migration[6.0]
def change
create_table :gifts do |t|
t.integer :price, null: false
t.references :giver, foreign_key: { to_table: :users }
t.references :receiver, foreign_key: { to_table: :profiles }
t.timestamps
end
end
end
gifts_controller.rb
class GiftsController < ApplicationController
before_action :find_profile, only: [:gift_params, :new, :create]
def new
@gift = Gift.new
end
def create
@gift = Gift.create(gift_params)
binding.pry
if current_user.save
redirect_to root_path
else
render :new
end
end
private
def gift_params
params.require(:gift).permit(:price).merge(giver_id: current_user.id, receiver_id: @profile.user_id)
end
def find_profile
@profile = Profile.find(params[:profile_id])
end
end
試したこと
アソシエーションの変更(何パターンか検証した)
gift.rb
class Gift < ApplicationRecord
belongs_to :giver, class_name: 'User'
belongs_to :receiver, class_name: 'Profile'
end
profile.rb
class Profile < ApplicationRecord
# 失敗した組み合わせ
has_many :gifts, foreign_key: 'receiver_id'
has_many :givers, through: :gifts, source: :receiver
#他にもたくさん失敗しましたが、忘れました
end
user.rb
class User < ApplicationRecord
# 失敗した組み合わせ
has_many :gifts, foreign_key: 'giver_id'
has_many :receivers, through: :gifts, source: :giver
end
ルーティングの変更
routes.rb
Rails.application.routes.draw do
resources :profiles, only: [:new, :create, :show, :edit, :update] do
resource :gifts, only: [:new, :create]
end
↑↓ #どっちも失敗
routes.rb
Rails.application.routes.draw do
resources :users do
resource :gifts, only: [:new, :create]
end
resources :profiles, only: [:new, :create, :show, :edit, :update]
ずっと同じエラー(Receiverを入力してください)が発生します。
Author And Source
この問題について([メモ] アソシエーション失敗 [未解決]), 我々は、より多くの情報をここで見つけました https://qiita.com/yait/items/2ade755cf46b8f8f4fbb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .