You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用删除用户库游戏:link_to路径与Controller问题排查

解决Rails应用中删除用户库游戏的报错问题

咱们先拆解一下你遇到的核心问题:报错PG::UndefinedColumn: ERROR: column games.game_id does not exist,本质是两个问题叠加导致的——路由参数传递不匹配,加上Controller里错误引用了不存在的数据库字段。下面一步步来解决:

1. 先搞清楚报错根源

你的Game模型里的game_id是attr_accessor,这只是内存中的临时属性,并没有在数据库的games表中创建对应的字段。但你在Controller的destroy方法里写了current_user.games.where(game_id: params[:id]),这会让ActiveRecord去查询games表的game_id列,自然会报错。

另外,你当前的删除路由delete 'user/:id/library'只接收用户ID,没法传递要删除的游戏ID,这导致你没法精准定位要移除的游戏。

2. 修正路由设计(改用RESTful嵌套路由)

你已经定义了用户和游戏的嵌套路由,但又额外加了一个单独的delete路由,这会冲突且不符合REST规范。建议保留嵌套路由,删掉单独的delete路由:

Rails.application.routes.draw do
  get 'library_game/index'
  devise_for :users
  root to: 'pages#home'
  get '/games', to: 'games#index', as: :index
  get '/user/:id', to: 'user#show'
  
  # 保留这个嵌套路由,它会生成RESTful的用户-游戏操作路径
  resource :user, only: [] do
    resources :games, only: [:create, :destroy]
  end

  get '/user/:id/library', to: 'library#index', as: :library
  post '/user/:id/library', to: 'games#create', as: :create
  # 删除下面这个冗余的delete路由
  # delete 'user/:id/library', to: 'games#destroy', as: :destroy
end

这个嵌套路由会生成user_game_path路径助手,对应的DELETE请求路径是/user/:user_id/games/:id,能同时传递用户ID和游戏ID,完美满足删除需求。

现在改用嵌套路由的路径助手,直接传递current_user和game对象即可:

<%= link_to 'Remove from library', user_game_path(current_user, game), method: :delete, data: { confirm: 'Are you sure you want to remove this game?' } %>

这样路径会自动生成正确的参数,把游戏ID作为:id传递给Controller。

4. 修正Controller的destroy方法

因为你要做的是从用户库中移除游戏(不是删除游戏本身),所以应该删除用户和游戏之间的关联记录,而不是游戏对象。修改后的代码:

def destroy
  # 找到当前用户与目标游戏的关联并删除(不会删除Game记录)
  current_user.games.delete(Game.find(params[:id]))
  # 如果你想直接删除中间表的关联记录,也可以这么写:
  # current_user.library_games.where(game_id: params[:id]).destroy_all
  
  redirect_to library_path(current_user)
end

这里params[:id]就是游戏的ID,对应数据库中games表的id列,不会再去查找不存在的game_id字段了。

额外检查:确保用户与游戏的关联正确

最后确认你的User模型关联是否和Game模型对应:

class User < ApplicationRecord
  has_many :libraries
  has_many :games, through: :libraries
  # 或者如果是直接通过library_games关联:
  # has_many :library_games
  # has_many :games, through: :library_games
end

这样用户和游戏的多对多关联才能正常工作。

内容的提问来源于stack exchange,提问作者SJK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:22:59