私はレールが初めてで、単純な銀行取引明細書コンバーターアプリを構築しています。ユーザーは銀行名を選択し、明細書をアップロードし、[変換] をクリックすると、変換されたファイルが自動的にダウンロードされます。
コントローラーで Rails ActionDispatch::::Http::UploadedFile属性、特に属性にアクセスする方法content_type
は? 検証メソッドでその属性を使用して、モデルでさらに処理するためにファイルを渡す前に、正しいファイル タイプを確認したいと思います。
メソッドがコントローラー.content_type
でプライベートメソッドとして明確に定義されていても[:content_type]
、何も機能しませんでした。NoMethodError
これが私の現在のアプリケーション設定です:
Webページでは、フォームを使用してユーザーが送信
: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">