уровень стека слишком глубокий 'создать' направляющие 6 - PullRequest
0 голосов
/ 06 августа 2020

привет, все, что я новичок в рельсах, я пытаюсь загрузить pdf, и я использую функцию создания и проверки только для принятия pdf-файлов, но после того, как я нажму кнопку `` Отправить '', продолжение рендеринга ничего не возвращает или не проверяет файл, но сохраняет загруженный файл правильно также он принимает файлы любого типа.

my controller.rb

class PdfController < ApplicationController
  
  def index
  end
     
  def create
      #@pdf = Pdf.new(pdf_params)
      @pdf = Pdf.new(pdf_params)

      if @pdf.save
        redirect_to @pdf, notice: 'Pdf was successfully uploaded.' and return
      else
        render 'new' and return
      end
  end

  def new
    @pdf = Pdf.new
  end

  def show
     @pdf = Pdf.find(params[:id])
  end

  private

  def set_pdf
    @pdf = Pdf.find(params[:id])
  end

  def pdf_params
    #params.require(:pdf).permit(:attachment)
    params.permit(:attachment)
  end

  def check_file_type
    if attachment.attached? && !attachment.content_type.in?(%w( application/pdf))
        errors.add(:attachment, 'Must be a PDF file')
    end
   end
end

model.rb

class Pdf < ActiveRecord::Base
   #has_many_attached :attachment
   has_one_attached :attachment
   #before_save :check_file_type
   validate :check_file_type ,  on: :save
   #validates :attachment, :presence=>true , content_type: ['application/pdf']
   #validates :attachment, file_content_type: { allow: [/^pdf\/.*/] }
   #validates :attachment, :attachment_content_type => { :content_type => ['application/pdf']}
   validates :attachment, attached: true, content_type: { in: 'application/pdf', message: 'is not a PDF' }

   
   def attachment1
       attachment_path = "#{Dir.tmpdir}/#{attachment.filename}"
       File.open(attachment_path, 'wb') do |file|
        file.write(attachment.download)
       end   
   end


   private 

   def check_file_type
      if attachment.attached? && !attachment.content_type.in?(%w(application/pdf))
          errors.add(:attachment, 'Must be a PDF file')
      end
   end
end

form. html .erb

<%= form_tag({action: :create}, multipart: true) do %>
   <%= file_field_tag 'pdf_file' %>
   <%= submit_tag 'Submit' %>
<% end %>

логи:

Started POST "/pdf" for 127.0.0.1 at 2020-08-06 19:57:58 +0530
Processing by PdfController#create as HTML
  Parameters: {"authenticity_token"=>"0uBffj57MCwiDYVhUoh3i1Dhil6Ept6v/gm7Pmk6VPvzIj1yY2ssAFPo6zGBA2716VhYnv3QVnS0qEzpiTMG+Q==", "pdf"=>{"attachment"=>#<ActionDispatch::Http::UploadedFile:0x000056475ce6ee08 @tempfile=#<Tempfile:/tmp/RackMultipart20200806-5019-qme0u2.pdf>, @original_filename="icinga2_advanced_1.6.0-handouts.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"pdf[attachment]\"; filename=\"icinga2_advanced_1.6.0-handouts.pdf\"\r\nContent-Type: application/pdf\r\n">}, "commit"=>"submit"}
Completed 500 Internal Server Error in 158ms (ActiveRecord: 0.0ms | Allocations: 66024)


  
SystemStackError (stack level too deep):

app/models/pdf.rb:13:in `attachment'
app/models/pdf.rb:13:in `attachment'
app/models/pdf.rb:13:in `attachment'
app/models/pdf.rb:23:in `check_file_type'
app/controllers/pdf_controller.rb:10:in `create'

кто-нибудь помогите мне с этим, пожалуйста

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать active_storage_validations gem.

Следующее правило уже проверяет тип содержимого.

validates :attachment, attached: true, content_type: { in: 'application/pdf', message: 'is not a PDF' }

Чтобы проверить размер, вы можете добавить следующее правило.

 validates :attachment, attached: true, size: { less_than: 10.megabytes , message: 'is not given between size' }

Чтобы проверить как content_type, так и размер:

validates :attachment, attached: true, content_type: { in: 'application/pdf', message: 'is not a PDF' },
                                       size: { less_than: 10.megabytes , message: 'is not given between size' }

Прочтите https://github.com/igorkasyanchuk/active_storage_validations, чтобы получить дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...