为什么Rails控制器show视图中自定义typeID参数被忽略查询报错
问题原因
- 路由参数名不匹配:你用默认的
resources :salvage生成的路由规则里,show动作的路径是/salvage/:id,所以访问/salvage/25605时,Rails会自动把路径里的25605赋值给params[:id],此时params[:typeID]的值为nil。 - 查询方法逻辑错误:
Salvage.find()方法默认是根据模型的主键id字段查询,你要自定义查询typeID字段的话,不能直接用find方法,传nil参数时就会触发你遇到的Couldn't find Salvage without an ID报错。
解决方法(按需选择即可)
方案1:最小改动适配现有路由
直接修改控制器show方法的查询逻辑,用find_by查询typeID字段,取路由传入的params[:id]作为查询值:
class SalvageController < ApplicationController def show @salvage = Salvage.find_by!(typeID: params[:id]) end end
提示:用find_by!替代find_by,匹配不到数据时会主动抛出404错误,和原有find的报错行为一致。
方案2:修改路由参数名匹配你的代码习惯
如果你希望路由参数名就是typeID,可以在路由配置里指定参数名:
# config/routes.rb resources :salvage, param: :typeID
修改后路由的show路径会变成/salvage/:typeID,此时params[:typeID]就能正常取到值,再配合修改查询方法即可:
@salvage = Salvage.find_by!(typeID: params[:typeID])
方案3:设置typeID为模型主键(适合typeID全局唯一、作为主键使用的场景)
如果你的typeID本身就是全局唯一的业务主键,可以直接在模型里指定主键,此时find方法就会默认查询typeID字段:
class Salvage < ApplicationRecord self.primary_key = :typeID validates :typeID, presence: true validates :amount, presence: true end
配合方案2修改路由参数名后,你原有控制器的Salvage.find(params[:typeID])代码可以直接正常运行。
内容的提问来源于stack exchange,提问作者Samji3877
相关产品推荐
相关产品推荐

