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

Rails添加鸡尾酒收藏时ActiveRecord关联类型不匹配错误排查

问题原因
  • 你在控制器的create方法中已经使用current_user.cocktails.build构造鸡尾酒实例,该方法会自动将当前登录用户与新鸡尾酒绑定,不需要额外传递用户参数
  • HTTP请求传递的所有参数都会被序列化为字符串,你在button_to中传递的user相关参数最终会变成用户ID的字符串值,而Cocktail模型的belongs_to :user关联期望接收User实例或整数类型的user_id,直接传递字符串参数会触发类型不匹配错误
  • 你在强参数cocktail_params中错误允许了:user字段,同时遗漏了api_id_drink、api_image_url两个自定义字段的权限,会导致这两个字段无法正常存入数据库
解决步骤
  1. 修改视图中的button_to代码,删除多余的user参数传递:
<%= button_to "Add Favorite", { :controller => "cocktails", :action => "create", :cocktail => {:name => drink["strDrink"], :category => drink["strCategory"], :alcoholic => drink["strAlcoholic"], :glass => drink["strGlass"], :instructions => drink["strInstructions"], :ingredients => drink["strIngredient1"], :api_id_drink => drink["idDrink"], :api_image_url => drink["strDrinkThumb"] }}, {:method => :post} %>
  1. 修改CocktailsController中的cocktail_params方法,移除:user字段的权限,补充新增API相关字段的权限:
def cocktail_params
  params.require(:cocktail).permit(:name, :category, :alcoholic, :glass, :instructions, :ingredients, :api_id_drink, :api_image_url)
end
可选优化

如果需要避免同一个用户重复收藏同一款鸡尾酒,可以在Cocktail模型中添加联合唯一校验:

validates :api_id_drink, uniqueness: { scope: :user_id, message: "你已经收藏过这款鸡尾酒了" }

内容的提问来源于stack exchange,提问作者Drew Peterson 7671

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:42:02