我是 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\"\r\nContent-Type: application/pdf\r\n">}, "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
- 然后在模型中,有私有方法所指
csv_check?
的方法:pdf_check?
file_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\"\r\nContent-Type: application/pdf\r\n">