Rails应用删除用户库游戏:link_to路径与Controller问题排查
咱们先拆解一下你遇到的核心问题:报错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,完美满足删除需求。
3. 修正link_to的参数传递
现在改用嵌套路由的路径助手,直接传递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

