#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)
завершение