Ruby 2.5.1 Rails 5.2.4.3
Je souhaite implémenter une fonction qui vous permet de publier / supprimer plusieurs images à l'aide de la fonction de gestion de fichiers standard Rails Active Storage.
$ rails new sample_app
$ cd sample_app 
$ bin/rails db:create
Dans un autre terminal
$ bin/rails s
Si vous accédez à http: // localhost: 3000 et voyez une image familière, c'est OK.
Cette fois avec le nom post.
$ bin/rails g model post name:string 
$ bin/rails db:migrate
$ bin/rails g controller posts
config/routes.rb
Rails.application.routes.draw do
  resources :posts
end
$ bin/rails active_storage:install
Copied migration 20200726095142_create_active_storage_tables.active_storage.rb from active_storage
Un fichier de migration est créé qui crée les deux tables suivantes. ・ Active_storage_attachments ・ Active_storage_blobs Migrez pour créer une table.
$ bin/rails db:migrate
== 20200726095142 CreateActiveStorageTables: migrating ========================
-- create_table(:active_storage_blobs)
   -> 0.0020s
-- create_table(:active_storage_attachments)
   -> 0.0019s
== 20200726095142 CreateActiveStorageTables: migrated (0.0041s) ===============
Rendre disponible en association avec le modèle
models/posts.rb
class Post < ApplicationRecord
  has_many_attached :images
end
controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
  def new
    @post = Post.new
  end
  def create
    @post = Post.new(post_params)
    if @post.save
      flash[:success] = "créé"
      redirect_to posts_path
    else
      render :new
    end
  end
  def destroy
    @post = Post.find(params[:id])
    @post.destroy
    flash[:success] = "créé"
    redirect_to posts_path
  end
  private
  def post_params
    params.require(:post).permit(:name, images: [])
  end
end
Page de la liste des messages
erb:posts/index.html.erb
<h1>Liste des messages</h1>
<%= link_to 'Nouveau poste', new_post_path %>
<%= render @posts %>
Cette fois, créez un article partiel et affichez-le.
erb:posts/_post.html.erb
<div class="post-partial">
  <li id="post-<%= post.id %>">
    <%= post.name %>
    <% post.images.each do |image| %>
      <%= image_tag(image, width:100) %>
    <% end %>
    <%= link_to 'Effacer', post, method: :delete, data: { confirm: 'Effacerしてよろしいですか?' } %>
  </li>
</div>
Multiple: true est requis lors de la publication de plusieurs images
erb:posts/new.html.erb
<%= form_with(model: @post, local: true) do |f| %>
  <div>
    <%= f.label :name, 'Nom' %>
    <%= f.text_field :title %>
  </div>
  <div>
    <%= f.label :images, 'image' %>
    <%= f.file_field :images, multiple: true %>
  </div>
  <div>
    <%= f.submit  'Publier' %>
  </div>
<% end %>
J'ai pu publier plusieurs images à partir d'un nouveau message.
Ajoutez les méthodes d'édition et de mise à jour requises pour l'édition.
controllers/posts_controllers.rb
  def edit
    @post = Post.find(params[:id])
  end
  def update
    post = Post.find(params[:id])
    if params[:post][:image_ids]
      params[:post][:image_ids].each do |image_id|
        image = post.images.find(image_id)
        image.purge
      end
    end
    if post.update_attributes(post_params)
      flash[:success] = "Édité"
      redirect_to posts_url
    else
      render :edit
    end
  end
C'est presque le même que la nouvelle page de publication, mais la partie pour afficher l'image enregistrée et la vérifier est ajoutée.
erb:posts/edit.html.erb
<%= form_with(model: @post, local: true) do |f| %>
  <div>
    <%= f.label :name, 'Nom' %>
    <%= f.text_field :name %>
  </div>
  <div>
    <%= f.label :images, 'image' %>
    <%= f.file_field :images, multiple: true %>
  </div>
  <% if @post.images.present? %>
    <p>Images actuellement enregistrées (cochez ce que vous souhaitez supprimer)</p>
    <% @post.images.each do |image| %>
      <%= f.check_box :image_ids, {multiple: true}, image.id, false %>
      <%= image_tag image, size:"100x100" %> <br>
    <% end %>
  <% end %>
  <div>
    <%= f.submit  'Éditer' %>
  </div>
<% end %>
erb:posts/index.html.erb
<div class="post-partial">
  <li id="post-<%= post.id %>">
    <%= post.name %>
    <% post.images.each do |image| %>
      <%= image_tag(image, width:100) %>
    <% end %>
    <%= link_to 'Éditer', edit_post_path(post.id) %>  #ajouter à
    <%= link_to 'Effacer', post, method: :delete, data: { confirm: 'Effacerしてよろしいですか?' } %>
  </li>
</div>
Cliquez sur le lien de modification dans le navigateur et cochez uniquement les images que vous souhaitez supprimer.

Je n'ai pu supprimer que n'importe quelle image.
Essayez de gérer plusieurs images à l'aide du stockage actif Comment supprimer plusieurs images avec ActiveStorage
Recommended Posts