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两个自定义字段的权限,会导致这两个字段无法正常存入数据库
解决步骤
- 修改视图中的
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} %>
- 修改
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
相关产品推荐
相关产品推荐

