[RUBY] [Rails] Télécharger des vidéos avec Rails (ActiveStorage)

Je fréquente actuellement une école de programmation et suis passé à la phase de production de portfolio. Je voulais faire quelque chose comme Insta Stories qui me permette de publier de courtes vidéos, mais je craignais qu'il y ait moins d'articles à télécharger que ce à quoi je m'attendais, donc je vais l'écrire pour ne pas l'oublier cette fois.

Site de référence

Utiliser le stockage actif

Au départ, je pensais l'implémenter en utilisant Carrierwave etc., mais quand je l'ai étudié, il semble que le téléchargement de fichiers puisse être fait avec la fonction standard de Rails, donc je vais l'implémenter ici. Je suis un débutant qui connaît ActiveStorage aujourd'hui, veuillez donc consulter les articles d'autres personnes pour plus de détails. Je laisserai le flux jusqu'à la publication vidéo. Ceci est une citation d'un site de référence.

Une fonction ajoutée dans Rails 5.2 pour télécharger des fichiers. Avec cela, vous pouvez facilement créer une fonction de publication d'image, etc. avec un formulaire. Vous pouvez également télécharger facilement des fichiers vers des services de stockage cloud tels qu'Amazon S3, Google Cloud Storage et Microsoft Azure Storage. En plus du stockage cloud, vous pouvez également enregistrer des fichiers sur votre disque local.

Installer le stockage actif

$ rails active_storage:install
$ rails db:migrate

Deux tables sont créées, ʻactive_storage_blobs et ʻactive_storage_attachments. Ces deux continueront comme ils sont.

Créer un modèle

Cette fois, nous allons simplement créer un modèle appelé «Vidéo». J'ai créé «titre» et «introduction» dans la colonne. Je n'ai pas créé de colonne pour la vidéo elle-même ici.

$ rails g resource video title:string introduction:text
$ rails db:migrate

Cette fois, nous supposerons que vous ne pouvez publier qu'une seule vidéo à la fois. Écrivez has_one_attached dans le modèle Video.

/app/models/video.rb


class Video < ApplicationRecord
  has_one_attached :video
end

: video est le nom du fichier, et il semble que vous puissiez lui donner n'importe quel nom en fonction de son objectif. (Si vous téléchargez une image, telle que : image)

Créer un contrôleur

Je vais l'écrire dans le contrôleur de vidéos.

/app/controllers/videos_controller.rb


class VideosController < ApplicationController

  def new
    @video = Video.new
  end

  def create
    @video = Video.new(video_params)
    @video.create
    redirect_to @video
  end

  def show
    @video = Video.find(params[:id])
  end

  private

  def video_params
    params.require(:video).permit(:title, :introduction, :video)
  end
end

Le modèle Video n'a pas de colonne: video, mais cela correspond à has_one_attaches: video. Cette fois, c'est un test pour voir si vous pouvez publier une vidéo, donc seule une nouvelle émission de création est écrite.

Créer une vue

Écrivez le formulaire de publication avec nouveau.

/app/views/videos/new.html.erb


<%= form_with model: @video, local: true do |form| %>
  <p>title</p><%= form.text_field :title %> <br>
  <p>introduction</p><%= form.text_area :introduction %> <br>
  <p>video</p><%= form.file_field :video %> <br>
  <%= form.submit %>
<% end %>

スクリーンショット 2020-09-02 14.26.29.png Je pense que le formulaire de publication a été créé comme ça. Nous allons également créer une page de spectacle.

/app/views/videos/show.html.erb


<% if @video.video.attached? %>
  <p><%= @video.title %></p> <br>
  <p><%= @video.introduction %></p>
  <%= video_tag rails_blob_path(@video.video) %>
<% end %>

Vous pouvez vérifier si @video a une vidéo avec .attached?.

Si vous écrivez simplement <% = video_tag @ video.video%>, il semble que vous recherchez des données dans le sens de / app / assets /, et vous obtiendrez une erreur dans le pipeline d'actifs. Écrivons rails_blob_path.

スクリーンショット 2020-09-02 14.34.49.png

Il est maintenant affiché. La vidéo ne sera pas lue si elle est laissée telle quelle. Écrivez «<% = video_tag%>» dans «

/app/views/videos/show.html.erb


<% if @video.video.attached? %>
  <p><%= @video.title %></p> <br>
  <p><%= @video.introduction %></p>
  <video src="<%= rails_blob_path(@video.video) %>" type="video/mp4" controls></video>
<% end %>

controls crée automatiquement une interface qui facilite l'utilisation de la vidéo. Vous pouvez désormais télécharger, afficher et même lire la vidéo.

スクリーンショット 2020-09-02 14.46.28.png

Je ne crée pas de colonnes, donc je suis sur le point de les lister, mais cela fonctionnera-t-il? Je posterai si quelque chose se produit à nouveau.

point important

Puisque cette fois, nous créons un portfolio, il est supposé que la vidéo sera du matériel gratuit et courte, environ quelques secondes, compte tenu du déploiement. Les longues vidéos sont de grande taille, donc cela semble être un gros problème si vous essayez de le faire localement ou sur le réseau. (Les gens de l'école m'ont averti de le garder au minimum nécessaire) Il semble y avoir une méthode telle que l'utilisation d'AWS S3 bien qu'il y ait des frais d'utilisation (même si je ne suis pas encore familier avec ce domaine) J'espère que si vous êtes un débutant comme vous, vous penserez qu'il existe une telle méthode.

Recommended Posts

[Rails] Télécharger des vidéos avec Rails (ActiveStorage)
Téléchargez facilement plusieurs images avec rails rails + carrierwave + cloudinary
[Ruby on Rails] Téléversement de plusieurs images avec refile
[Rails 6] Erreur d'exécution avec $ rails s
Manipuler le dispositif avec des rails
[Rails] Didacticiel Apprendre avec les rails
[Rails] Test avec RSpec
[Rails] Développement avec MySQL
Prend en charge la multilinguisme avec Rails!
[Rails] Polymorphique express avec graphql-ruby
[Vue Rails] "Hello Vue!" Affiché avec Vue + Rails
Japaneseize en utilisant i18n avec Rails
Préparation au développement avec Rails
Téléchargement de fichiers avec Spring Boot
Rails Active_storage -Simplifier l'enregistrement des images-
Exécuter des rails à chaque fois dans le docker
[Docker] Construction de l'environnement Rails 5.2 avec docker
Utilisez plusieurs bases de données avec Rails 6.0
[Rails] Spécifiez le format avec link_to
[Docker] À utiliser à tout moment avec Docker + Rails
Créer un portfolio avec rails + postgres sql
[Rails] Transmission push avec LINE Bot
[Rails] Rendre la pagination compatible avec Ajax
Créer une fonction de pagination avec Rails Kaminari
[Grover] Générer un PDF avec des rails [version 2020]
[Rails] Création initiale des données avec seed
Rails6 OmniAuth activestorage Obtenir l'image de l'utilisateur
Suivre les erreurs de l'application Rails avec Sentry
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Connectez-vous au serveur Rails avec iPhone
Créer ma page avec Rails
Présentation de React to Rails avec react-rails
[Rails] Entrée de données initiale avec seed_fu!
Recherche intemporelle avec Rails + JavaScript (jQuery)
[rails] Faisons un test unitaire avec Rspec!