Rails Strong Params中:image参数的合法取值咨询
关于Rails Strong Params中
:image参数取值的确认 从你给出的代码来看,你的假设其实不太对,咱们一步步理清楚:
先看后端的参数要求
你的Strong Params定义是这样的:
def image_params params.require(:image).permit(:data, :x, :y, :width, :height) end
这里的params.require(:image)要求请求必须携带一个顶层的:image键,而这个键对应的值得是一个包含:data、:x、:y、:width、:height这些可选子字段的哈希结构,不是单个的ID值哦。
再看你当前的前端提交问题
你现在的前端代码是把image作为单独字段传了ID值:
updateImage: function (e) { e.preventDefault() var formData = new FormData() formData.append(`x`, this.crop_x) formData.append(`y`, this.crop_y) formData.append(`width`, this.crop_width) formData.append(`height`, this.crop_height) formData.append(`image`, this.imageID) this.$http.patch(`/articles/${this.id}/images/${this.imageID}`, formData) }
这种提交方式下,后端接收到的params里的:image是单个字符串(比如16),完全不符合require(:image)要求的哈希结构,会直接抛出参数缺失的错误。
正确的前端提交方式
你需要把裁剪相关的参数都嵌套到image这个命名空间下,FormData的写法要改成这样:
updateImage: function (e) { e.preventDefault() var formData = new FormData() // 将所有参数嵌套到image字段下,符合后端的哈希结构要求 formData.append(`image[x]`, this.crop_x) formData.append(`image[y]`, this.crop_y) formData.append(`image[width]`, this.crop_width) formData.append(`image[height]`, this.crop_height) // 如果需要上传图片文件,就添加这个字段(对应后端的:data) // formData.append(`image[data]`, this.selectedImageFile) this.$http.patch(`/articles/${this.id}/images/${this.imageID}`, formData) }
这样后端接收到的params结构会是:
{ image: { x: "你的裁剪x值", y: "你的裁剪y值", width: "裁剪宽度", height: "裁剪高度" # data: 如果传了文件的话也会在这里 }, id: "16", # 这个是从URL里自动解析出来的图片ID article_id: "文章ID" # 同样来自URL路由参数 }
这时候image_params就能正确提取到你需要的参数了。
额外提醒
你提到的图片ID(比如16)其实已经包含在请求URL的/images/${this.imageID}里了,Rails会自动把这个值放入params[:id]中,根本不需要再通过FormData传递。你之前的写法反而画蛇添足,还不符合后端的参数要求。
内容的提问来源于stack exchange,提问作者t56k
相关产品推荐
相关产品推荐

