«параметр отсутствует или значение пустое:» Скрепка не выбран файл — Рельсы

#ruby-on-rails #validation #activerecord #paperclip #strong-parameters

#ruby-on-rails #проверка #activerecord #скрепка #strong-параметры

Вопрос:

Я создаю приложение для фотогалереи, которое позволяет пользователям прикреплять несколько фотографий к каждой из своих галерей. Я использую скрепку для обработки загрузки файлов.

Приведенный ниже код работает нормально, пока в форме не будет нажата кнопка [Загрузить], при этом файл не выбран. Насколько я понимаю, он застревает на контроллере до того, как он будет передан Photo модели для проверки его наличия, типа файла и размера файла.

Ошибка, полученная при нажатии [Загрузить] без выбранного файла: «параметр отсутствует или значение пустое: на фотографии» Извлеченный источник имеет photo#photo_params выделенную строку.

Модель галереи:

 class Gallery < ActiveRecord::Base
  belongs_to :user
  has_many :photos
end
  

Фотомодель:

 class Photo < ActiveRecord::Base
  belongs_to :user
  belongs_to :gallery

  has_attached_file :photo,
    s3_permissions: :private

  validates_attachment :photo,
    presence: true,
    content_type: {
      content_type: [
        "image/jpeg", # JPEG/JPG
        "image/png" # PNG
        ] },
    size: { in: 0..5.megabytes }
end
  

Действие контроллера (фотографии #создать):

   def create
    @photo = Photo.new(photo_params)
    @photo.gallery_id = @gallery.id
    @photo.user_id = current_user.id

    if @photo.save
      flash[:success] = "Photo successfully saved."
      redirect_to gallery_path(@photo.gallery)
    else
      flash[:error] = "The photo upload failed! Make sure the file you're trying to upload is of a supported type (JPG, JPEG or PNG) and try again."
      redirect_to gallery_path(@photo.gallery)
    end
  end
  

Сильные параметры (фотографии #photo_params):

 def photo_params
  params.require(:photo).permit(:photo)
end
  

Форма загрузки:

 <%= form_for Photo.new, url: gallery_photos_path(@gallery) do |f| %>
    <%= f.label :photo %>
    <%= f.file_field :photo %>

    <%= f.submit "Upload" %>
  <% end %>
  

Я понимаю, что использование Model.new в форме, вероятно, не является лучшей практикой, но поскольку форма загружается как частичная в представлении galleries #show, это был единственный способ, которым я мог ее запустить.

Я также думаю, что наличие имени модели :photo и фактического вложения скрепки также :photo может вызывать проблему. Это правильно?

Кто-нибудь знает, что здесь происходит?

Ответ №1:

Да, я думаю, как вы упомянули, вам следует переименовать ваше вложение скрепки, хотя я не уверен, вызывает ли это какие-либо проблемы, имея такой код, как photo_params.require(:photo).permit(:photo) cant, ничего хорошего.

Кроме того, для вашего условия else в create сначала попробуйте перенаправить на root_path . Я думаю, что ваш маршрут может быть неправильным, поскольку ваша переменная экземпляра @photo на самом деле Photo.new .

Надеюсь, это поможет! Я не эксперт по рельсам. Приветствия.

Ответ №2:

Глядя на ошибку, я думаю, что она проверяет наличие «фото» в параметрах.

Поскольку вы добавили ‘presence: true’ в validates_attachment:фотоблок, вы должны указать это в параметрах

или

если вы хотите загрузить форму без файла, вы должны удалить ограничение «присутствие: истина».

Ответ №3:

определение photo_params

     params.require(:photo).permit(:photo)
  

завершение

измените имя атрибута, которое путается с модальным, и имя атрибута может быть

определение photo_params

params.require(:фото).разрешить (:photo_url)

завершение