0

私はレールが初めてで、単純な銀行取引明細書コンバーターアプリを構築しています。ユーザーは銀行名を選択し、明細書をアップロードし、[変換] をクリックすると、変換されたファイルが自動的にダウンロードされます。

コントローラーで 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_checkconverter_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

ただし、現在NoMethodErrorfile_checkメソッドはプライベートメソッドとして明確に定義されていますが、取得しましたConvertersControllerstream_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">
4

1 に答える 1