LoginSignup
1
5

More than 3 years have passed since last update.

ユーザー画像編集時にプレビューを表示する

Last updated at Posted at 2020-10-08

はじめに

ユーザーの画像変更時に、ファイルは上げたもののはっきり変更されてるのかどうかが分かりづらかったため、jQueryを使ってうまいことプレビュー表示させるようにした(フロント苦手、、、)。

ruby 2.6.3
rails 6.0.3
アップローダー ActiveStorage
jQuary

概要

やりたい挙動

ファイルアップロード前:既にユーザーに紐づいている画像をプレビュー表示
ファイルアップロード後:既にユーザーに紐づいている画像の表示を非表示にして、
            新たな画像ファイルをプレビュー表示

実装ファイル一覧

users
①edit.html.slim
②_form.html.slim(form部分だけ切り出して使用。全てeditに書いても問題ありません。)
③javascripts/app/users/edit.js

実装

edit.html.slim
- content_for :title
  = I18n.t 'helpers.title.edit', model: t_model(:user), name: @user.name

== render 'form', model: @user
_form.html.slim
= render 'shared/validation_messages', model: model
= simple_form_for model, html: { class: 'form-horizontal js-editing' } do |f|

  .page-content.container.profile_edit
    .card
      .card-header
        h5.card-title
          | 基本情報
      .card-body.p-3.ibox-content
        .no-padding.no-margins
          .circle-avatar
            img src="#" id="avatar_img_prev" class="d-none"
            - if model.image.attached?
              = image_tag(model.image, class: 'avatar_present_img')
            - else
              = image_tag("defaurt-user.png", class: "avatar_present_img")
          |
          br
          = f.file_field :image, id: "post_img"

          = f.input :name, placeholder: '山田 花子'
      / 以下略
javascripts/app/users/edit.js
/* global $ */

$(function() {
  function readURL(input) {
    if (input.files && input.files[0]) {
      var reader = new FileReader();

      reader.onload = function (e) {
        $('#avatar_img_prev').attr('src', e.target.result);
      };
      reader.readAsDataURL(input.files[0]);
    }
  }

  $("#post_img").change(function(){
    $('#avatar_img_prev').removeClass('d-none');
    $('.avatar_present_img').remove();
    readURL(this);
  });
}());

やっててつまづいたとこ

・slim記法でのimgの書き方はimg src: "~~", id: "~~"ではなく、img src="~~" id="~~"と書く(滅多に書かないから分からなかった、、、)。

img src="#" id="avatar_img_prev" class="hidden"のclassがうまく反映されなかったため、class="d-none"に変更 → 効いた

・jQuaryをform.slim上に書いてうまく反映されなかったため、ちゃんとjsファイルに書き直した。

参考

【Rails5】アップロードした画像を即時プレビューする

Webアプリ tsunagaru をリリースしました [4] ActiveStorage から CarrierWave への移行

Bootstrap4 displayクラスの使い方を徹底解説

html.erbファイルでjs直書きでその中にrubyのコードを埋め込んでいる状態のものをslimに置き換えるときの書き方

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5