Rails-如何访问我的方法中的ActionDispatchUploadedFile默认属性



我是rails和构建一个简单的银行对账单转换器应用程序的新手。用户将选择银行名称,上传他们的对账单,点击";转换";,并且转换后的文件将被自动下载。

如何访问控制器中的Rails ActionDispatch:::Http::UploadedFile属性,特别是content_type属性?在将文件传递给模型进行进一步处理之前,我想在验证方法中使用该属性来检查文件类型是否正确。

我尝试了.content_type[:content_type],但都不起作用,导致了NoMethodError,尽管该方法在控制器中明确定义为私有方法。

这是我当前的应用程序设置:

  • 在网页中,表单将允许用户提交:bank:statement参数。

  • ConvertersController中,使用专用converter_params方法保护参数,从而得到以下完整参数(如服务器日志中捕获的(:

Parameters: {"authenticity_token"=>"[FILTERED]", "converter"=>{"bank"=>"bank1", "statement"=>#<ActionDispatch::Http::UploadedFile:0x000055d9699140e0 @tempfile=#<Tempfile:/tmp/RackMultipart20210401-31472-dvsdde.pdf>, @original_filename="bank1.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name="converter[statement]"; filename="bank1.pdf"rnContent-Type: application/pdfrn">}, "commit"=>"convert"}
  • 然后在:create操作中,我将file_check私有方法应用于上传的语句(即converter_params[:statement](,以检查文件类型是否正确:
ConvertersController < ApplicationController
.
.
.
def create
@converter  = Converter.new(converter_params)
if converter_params[:statement].nil?
flash.now[:alert] = "Error: no statement provided"
render action: "index"
elsif converter_params[:statement].file_check
flash.now[:alert] = "Error: wrong file type"
render action: "index"
else
result      = @converter.run_conversion
file_path   = Rails.root.join('public', 'output', result)
stream_then_delete_statement(file_path)
end
end
.
.
.
private 
def converter_params
params.require(:converter).permit(:bank, :statement)
end
def file_check
pdf_statement = [ "bank1" ]
csv_statement = [ "bank2" ]
if pdf_statement.include? converter_params[:bank]
self.content_type.pdf_check?
elsif csv_statement.include? converter_params[:bank]
self.content_type.csv_check?
else
exit(0)
end
end
.
.
.
end
  • 则在模型中,file_check私有方法所指的有csv_check?pdf_check?方法:
class MyModel < ActiveRecord::Base
def pdf_check?
self == "application/pdf"
end
def csv_check?
self == "application/csv"
end
.
.
.
end

然而,目前我得到了NoMethodError,尽管file_check方法在ConvertersController中被明确定义为私有方法。这个错误让我很困惑,因为stream_then_delete_statement等其他私有方法工作正常。

完全错误:

NoMethodError in ConvertersController#create
undefined method `file_check' for #<ActionDispatch::Http::UploadedFile:0x000055d9699140e0 @tempfile=#<Tempfile:/tmp/RackMultipart20210401-31472-dvsdde.pdf>, @original_filename="bank1.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name="converter[statement]"; filename="bank1.pdf"rnContent-Type: application/pdfrn">

您在类ConvertersController中定义了方法file_check,但使用类ActionDispatch::Http::UploadedFile的实例调用它。

您的错误信息显示:

undefined method `file_check' for #<ActionDispatch::Http::UploadedFile:0x000055d9699140e0 @tempfile=#<Tempfile:/tmp/RackMultipart20210401-31472-dvsdde.pdf>, @original_filename="bank1.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name="converter[statement]"; filename="bank1.pdf"rnContent-Type: application/pdfrn">

这意味着它试图在类ActionDispatch::Http::UploadedFile的对象上调用方法file_check,但找不到。

您应该直接调用该方法,并将语句params作为参数传递给该方法:

elsif file_check(converter_params[:statement])
.
.
.
def file_check(statement_params)
.
.
.
end

您可以通过调用self来查找当前对象。尝试使用像byebug这样的调试器https://github.com/deivid-rodriguez/byebug检查。

ActionDispatch::Http::UploadedFile的初始化方法应为hash[:type],而不是hash[:content_type]

ruby文档在这一点上并不清楚。

相关内容

  • 没有找到相关文章

最新更新