问题描述
我遇到了一个前所未有的奇怪问题,即在设置活动存储时从未出现过,而在我的控制器中不允许使用文件参数。
这是我的模特
class Upload < ApplicationRecord
has_one_attached :file
# ...removed for brevity
end
以及控制器中的create方法
class Api::V1::Agent::UploadsController < Api::V1::AgentController
# ...removed for brevity
# POST /uploads
def create
@upload = Upload.new(upload_params)
if @upload.save
render json: @upload,status: :created,location: @upload
else
render json: @upload.errors,status: :unprocessable_entity
end
end
private
# Only allow a trusted parameter "white list" through.
def upload_params
params.require(:upload).permit(:company_id,:employee_id,:title,:tags,:secure,:file)
end
end
这是调用require
和permit
之前params对象的外观。
<ActionController::Parameters {"company_id"=>1,"employee_id"=>"","title"=>"Testing","file"=>{"rawFile"=>{"path"=>"teams-icon.png"},"src"=>"blob:http://localhost:3000/cee6f897-8a93-4e27-ab8e-724e6ec60f29","title"=>"teams-icon.png"},"format"=>:json,"controller"=>"api/v1/agent/uploads","action"=>"create","upload"=><ActionController::Parameters {"company_id"=>1,"title"=>"Testing s3 storage"} permitted: false>} permitted: false>
然后
<ActionController::Parameters {"company_id"=>1,"title"=>"Testing s3 storage"} permitted: true>
如果我在#create中抛出一个Pry断点,我可以调用@upload.file
并查看虚拟文件属性,但由于某些原因,不允许使用:file
参数。
编辑:
我试图像params.require(:upload).permit(file: {})
一样允许文件参数为哈希,并且得到相同的结果。
我还尝试将文件作为blob url字符串提交(例如{"company_id"=>1,"file"=>"blob:http://localhost:3000/1e72ade4-97fc-4535-88e9-45884bcd9633"}
而不是嵌套的哈希,但是:file仍从允许的参数中删除。
解决方法
params [:file]是一个散列,因此您必须使用一些不同的方式来允许它
params.require(:upload).permit(:company_id,:employee_id,:title,:tags,:secure,file: {})