Ruby on Rails中表单提交获得哈希而非单纯字段值该如何解决?
问题原因
你在初始化Cat对象时,将params[:cat].permit(:name)返回的参数对象直接赋值给了name字段。permit方法返回的是包含{"name" => "Loki"}结构的哈希对象,而非name对应的字符串值,因此整个哈希会被序列化后存入name字段,导致存储结果不符合预期。
解决方案
提供两种符合Rails开发规范的修复方式:
- 方案1:直接提取
name字段值(适合字段较少的场景)
def create #POST /cats @cat = Cat.new(name: params[:cat][:name]) if @cat.save redirect_to cat_url(@cat) else render :new end end
如果需要保留参数校验,也可以写为name: params[:cat].permit(:name)[:name]。
- 方案2:抽离强参数方法整包赋值(Rails官方推荐写法,适合后续扩展字段的场景)
def create #POST /cats @cat = Cat.new(cat_params) if @cat.save redirect_to cat_url(@cat) else render :new end end private # 单独抽离强参数校验逻辑,后续新增字段直接在permit的数组中添加即可 def cat_params params.require(:cat).permit(:name) end
该写法中cat_params返回的是{name: "Loki"}结构的哈希,传入Cat.new时会自动匹配属性赋值,不会出现哈希整体存入字段的问题。
内容的提问来源于stack exchange,提问作者Yato Aki
相关产品推荐
相关产品推荐

