以下のエラーが解消できず困っております。
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
))
何が原因なのかがわかりません・・・
ご教授いただけますと幸いです。
あなたの回答
tips
プレビュー