[Ruby On Rails] Causes et remèdes pour ActionView :: Template :: Error (ActiveStorage :: InvariableError) (hypothèse / vérification)

C'est un mémorandum. Nous avons émis l'hypothèse et vérifié la cause d'ActionView :: Template :: Error (ActiveStorage :: InvariableError) et comment y faire face.

Arrière-plan / arrière-plan de l'erreur

J'ai décidé de vérifier le fonctionnement de l'application déployée. Cette fois, je veux simplement vérifier manuellement si l'image a été téléchargée, j'ai donc décidé de vérifier l'opération sans effectuer de test unitaire ou d'intégration.

Cette fois, j'ai demandé à mes amis autour de moi de coopérer au test de contrôle de fonctionnement. En ce qui concerne la coopération, j'ai demandé de joindre un fichier à un formulaire permettant de publier des images et de vérifier si le fichier publié peut être affiché dans la vue.

contenu de l'erreur

J'ai reçu un rapport d'un ami collaborateur selon lequel j'ai joint un fichier image, j'ai donc vérifié l'écran des détails de l'application déployée. Ensuite, "Nous sommes désolés mais une erreur s'est produite" s'est affiché.

Tout d'abord, j'ai vérifié le journal et ses détails d'erreur dans le terminal. (Cette fois heroku)

% heroku logs --tail

(Omission)

ActionView::Template::Error (ActiveStorage::InvariableError)
    34: <div>
    35:image
    36: </div>
    37: <%= image_tag @question.image.variant(resize: '200x200'), class: 'question-image' if @question.image.attached? %>
    38: <% end %>
    39:
    40: <%= render 'shared/error_messages', model: @comment %>
app/views/questions/show.html.erb:37

Ce que j'ai regardé

J'ai vérifié l'article sur le contenu de l'erreur. La clé pour résoudre cette erreur était "utiliser la variable? Méthode pour distinguer si un objet blob est une variable". La variable mentionnée ici est l'image jointe, mais il s'est avéré que la clé est de savoir si la bonne variable (image) est donnée.

"Qu'est-ce qui est variable? En premier lieu?"

Ainsi, quand je l'ai recherchée sur le net, elle a été utilisée lors de l'utilisation de variable? Pour permettre d'appeler l'image uniquement lorsqu'elle était True. Ensuite, en le combinant avec la méthode ActiveStorage.variable_content_types, j'ai trouvé qu'elle limite l'attachement d'images avec uniquement l'extension spécifiée.

hypothèse

En premier lieu, le fichier posté par un ami n'est pas un fichier image, ou une image avec une extension prise en charge par active_storage. J'ai fait l'hypothèse.

Qu'est-ce qui s'est passé

J'ai interrogé un ami sur la possibilité de publier autre chose qu'une image. Ensuite, la réponse a été "Je l'ai joint sans vérifier avec Tekito à partir des fichiers dans lesquels des images et des fichiers avec d'autres extensions sont mélangés". En d'autres termes, il est fort possible que quelque chose d'autre que l'image soit attaché.

Sur la base de ce que j'ai entendu de mes amis et de ma propre hypothèse, j'ai essayé de voir si je pouvais joindre et enregistrer un fichier avec la mauvaise extension, et si la page de détails entraînait une erreur.

résultat

Comme avec mes amis, j'ai pu enregistrer des données avec une extension qui n'avait rien à voir avec cela. Ensuite, lorsque je suis passé à la page de détails, le message "Nous sommes désolés mais une erreur s'est produite" a également été affiché.

En d'autres termes, il s'est avéré qu '"un fichier avec l'extension correcte n'a pas été envoyé".

Dans le futur, utilisez la méthode ActiveStorage.variable_content_types etc. afin que l'enregistrement autre qu'une extension spécifique soit rejeté afin qu'une erreur comme celle-ci ne se produise pas.

Supplément

Pendant le processus de test, il n'était parfois pas possible de télécharger si l'extension d'image était .heic (dans certains cas, la cause est inconnue). Comme décrit dans le deuxième article de l'article de référence, il semble qu'il ne supporte pas actuellement les fichiers avec l'extension .heic, il peut donc être préférable de l'éviter et d'écrire uniquement good ou heic. Je ne sais pas.

La lecture d'articles en anglais est assez importante

Article de référence

https://edgeapi.rubyonrails.org/classes/ActiveStorage/InvariableError.html https://stackoverflow.com/questions/60686249/activestorageinvariableerror-in-homeindex https://qiita.com/xusaku_/items/36a61e35b6cd863bbf9d

Recommended Posts

[Ruby On Rails] Causes et remèdes pour ActionView :: Template :: Error (ActiveStorage :: InvariableError) (hypothèse / vérification)
Explication de Ruby on rails pour les débutants ⑤ ~ Modifier et supprimer la base de données ~
[Ruby / Rails] Mécanisme de nouvelle tentative d'erreur de thread
Explication de Ruby sur rails pour les débutants ①
[Ruby on Rails] Ajoutez et supprimez des balises et affichez les messages (succès / erreur) en utilisant ajax.
Paramètres de validation pour la fonction de connexion Ruby on Rails
[Manuel de procédure pour débutant 2] Ruby on Rails: Création d'un modèle Rails
[Ruby on Rails] Mémo d'introduction Select2 pour Webpacker
Ruby on Rails ~ Principes de base de MVC et du routeur ~
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
[Ruby on Rails] Affichage individuel des messages d'erreur
Explication de Ruby on rails pour les débutants ④ ~ À propos des règles de dénomination et comment utiliser form_Tag ~
Explication de Ruby sur rails pour les débutants ⑥ ~ Création de validation ~
Explication de Ruby on rails pour les débutants ② ~ Création de liens ~
(Ruby on Rails6) Comment créer un modèle et une table
Explication de Ruby on rails pour les débutants ⑦ ~ Implémentation Flash ~
Causes et remèdes pour l'exception «ServletException: Erreur lors de l'instanciation de la classe de servlet» lors du déploiement d'applications Java