質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1015閲覧

Mysql2::Error: Unknown column 'favorites.true' in 'where clause'の対処について

tarotarotarotar

総合スコア41

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/16 07:06

編集2020/10/16 08:47

以下のエラーが解消できず困っております。

ActiveRecord::StatementInvalid in NutritionsController#destroy
Mysql2::Error: Unknown column 'favorites.true' in 'where clause'

パラメータは以下になります。
{"_method"=>"delete", "authenticity_token"=>"i0BwagvJ5opWqMTriPNDgX6HXIgqqnhUUpgUWOFPmeUVjOSkC5FOw63ZPU24kv5R0J6z4nnJqIzpsV/fUtSIQA==", "id"=>"29"}

userが登録済みのnutrition(食材)を削除するという簡単な動作です。
destroyアクションをビューから呼び出している際に発生していると思われます。
対象のコードは以下になります。

【ビュー】index.html.erb ★末尾から3行目でdestroyアクションを呼び出しております。

<% @nutritions.each do |nutrition| %> <tr height="60" class="content-post"> <% if user_signed_in? %> <% if current_user.already_favorited?(nutrition, current_user) %> <td class="ingredient-column fav-color" id="ingredient-column">★<%= nutrition.ingredient %> <% else %> <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %> <% end %> <% else %> <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %> <% end %> <div class="more" id="more"> <ul class="more-list" id="more-list"> <li> <% if user_signed_in? %> <% if current_user.already_favorited?(nutrition, current_user) %> <%= link_to '解除', nutrition_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id, id:0), method: :delete %> <% else %> <%= link_to '登録', user_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id), method: :post %> <% end %> <% if current_user.id == nutrition.user.id %> <%= link_to '編集', edit_nutrition_path(nutrition.id), method: :get %> <%= link_to '削除', nutrition_path(nutrition.id), method: :delete, data: { confirm: '削除しますか?'} %> <% end %> <% end %>

【コントローラー】★ここのdestroyアクション時にエラーが発生しております。

class NutritionsController < ApplicationController before_action :move_to_index, except: [:index] before_action :set_nutrition, only: [:edit, :update] def index @nutritions = Nutrition.includes(:user).order("nutritions.id DESC") end def new @nutrition = Nutrition.new end def create Nutrition.create(nutrition_params) end def search @nutritions = Nutrition.search(params[:keyword]) end def edit end def update @nutrition.update(nutrition_params) end def destroy nutrition = Nutrition.find(params[:id]) nutrition.destroy ★エラー箇所★ redirect_back fallback_location: root_path end private def set_nutrition @nutrition = Nutrition.find(params[:id]) end def nutrition_params params.require(:nutrition).permit(:ingredient, :calorie, :protein, :lipid, :carbohydrate, :potassium, :calcium, :iron, :vitamin_a, :vitamin_b1, :vitamin_b2, :vitamin_c, :salt_equivalent).merge(user_id: current_user.id) end def move_to_index unless user_signed_in? redirect_to action: :index end end end

【ルーティング】routes.rb

Rails.application.routes.draw do devise_for :users # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'nutritions#index' resources :nutritions do collection do get 'search' end member do post "add", to: "favorites#create" end resource :favorites, only: [:destroy] end resources :users do resources :favorites, only: [:show, :create] end end

【モデル】favaritesという中間テーブルとアソシエーションを組んでおります。
nutrition.rb

class Nutrition < ApplicationRecord belongs_to :user has_many :favorites, foreign_key: true, dependent: :destroy has_many :fav_users, through: :favorites, source: :user with_options presence: true do validates :ingredient validates :calorie, numericality: { only_integer: true } validates :protein, numericality: { only_integer: true } validates :lipid, numericality: { only_integer: true } validates :carbohydrate, numericality: { only_integer: true } validates :potassium, numericality: { only_integer: true } validates :calcium, numericality: { only_integer: true } validates :iron, numericality: { only_integer: true } validates :vitamin_a, numericality: { only_integer: true } validates :vitamin_b1, numericality: { only_integer: true } validates :vitamin_b2, numericality: { only_integer: true } validates :vitamin_c, numericality: { only_integer: true } validates :salt_equivalent, numericality: { only_integer: true } end def self.search(search) if search != "" Nutrition.where('ingredient LIKE(?)', "%#{search}%") else Nutrition.all end end end

favorite.rb

class Favorite < ApplicationRecord belongs_to :user belongs_to :nutrition validates_uniqueness_of :nutrition_id, scope: :user_id end コード

エラー分ではUnknown column 'favorites.true' in 'where clause'とありますが、今回のdestroyアクションではfavoritesに全く触れているつもりはないのですがなぜここで出てきてしまうのでしょうか。

アソシエーションにてdependent: :destroyが組んであるので試しに消去してみると以下のエラーが発生します。
Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (berries_development.favorites, CONSTRAINT fk_rails_2201ed1284 FOREIGN KEY (nutrition_id) REFERENCES nutritions (id))

何が原因なのかがわかりません・・・
ご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問