🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

998閲覧

ツイート投稿編集ページに画像プレビューを表示

shawn_709

総合スコア13

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/12/01 02:29

編集2020/12/01 04:19

ご回答いただけるとありがたいです。よろしくお願いします!

実現したいこと

・ツイート編集ページで画像をプレビューで表示する
・編集画面に遷移した時点で画像が添付されていたら、プレビューで表示されている状態にする

発生している問題

ツイート新規投稿ページでは、プレビューが表示されています。
しかし、編集ページをコンソールで見たら、そもそもpreview.jsが読み込まれていません。

該当のソースコード

js

1#application.js 2require("@rails/ujs").start() 3require("@rails/activestorage").start() 4require("channels") 5require('./preview') 6 7 8#preview.js 9if (document.URL.match( "tweets/new" ) || document.URL.match( "tweets/edit" )) { 10 document.addEventListener('DOMContentLoaded', function(){ 11 const ImageList = document.getElementById('image-list'); 12 13 const createImageHTML = (blob) => { 14 const imageElement = document.createElement('div'); 15 16 const blobImage = document.createElement('img'); 17 blobImage.setAttribute('src', blob); 18 19 imageElement.appendChild(blobImage); 20 ImageList.appendChild(imageElement); 21 }; 22 23 document.getElementById('tweet_image').addEventListener('change', function(e){ 24 const imageContent = document.querySelector('img'); 25 if (imageContent){ 26 imageContent.remove(); 27 } 28 29 const file = e.target.files[0]; 30 const blob = window.URL.createObjectURL(file); 31 32 createImageHTML(blob); 33 }); 34 }); 35}

views

1#new.html.erb 2<%= form_with model: [@group, @tweet], local: true do |f| %> 3 <div class="form-input"> 4 <%= f.text_area :content, class:'form-tweet', placeholder:'type a tweet' %> 5 </div> 6 <div class="tweet-form"> 7 <div class="tweet-form-left"></div> 8 <div class="tweet-form-right"> 9 <label class="form-image"> 10 <span class="image-file">画像</span> 11 <%= f.file_field :image, class: 'hidden' %> 12 </label> 13 </div> 14 </div> 15 <div id="image-list"></div> 16 <div class="tweet-form"> 17 <div class="tweet-form-left"></div> 18 <div class="tweet-form-right"> 19 <%= f.submit '投稿する', class:'form-submit' %> 20 </div> 21 </div> 22<% end %> 23 24 25#edit.html.erb 26<%= form_with model: [@group, @tweet], local: true do |f| %> 27 <div class="form-input"> 28 <%= f.text_area :content, class:'form-tweet', placeholder:'type a tweet' %> 29 </div> 30 <div class="tweet-form"> 31 <div class="tweet-form-left"></div> 32 <div class="tweet-form-right"> 33 <label class="form-image"> 34 <span class="image-file">画像</span> 35 <%= f.file_field :image, class: 'hidden' %> 36 </label> 37 </div> 38 </div> 39 <div id="image-list"></div> 40 <div class="tweet-form"> 41 <div class="tweet-form-left"></div> 42 <div class="tweet-form-right"> 43 <%= f.submit '更新する', class:'form-submit' %> #この部分だけnew.html.erbと違う 44 </div> 45 </div> 46<% end %>

###試したこと
newとeditを部分テンプレート_form.html.erbにまとめて
newとeditは<%= render partial: "form"%>としてみました。
しかし、変わらずnewではブレビューが表示されるが、editでは表示されなかったです。

以上になります。ご助言いただけると幸いです。

###追記

controller

1#tweets 2 3class TweetsController < ApplicationController 4 before_action :authenticate_user!, only: [:index, :new, :edit] 5 before_action :set_group 6 before_action :set_tweet, only: [:show, :edit, :update, :destroy] 7 8 def index 9 @tweets = @group.tweets.includes(:user).order("created_at DESC") 10 end 11 12 def new 13 @tweet = Tweet.new 14 end 15 16 def create 17 @tweet = @group.tweets.new(tweet_params) 18 if @tweet.save 19 redirect_to group_tweets_path(@group) 20 else 21 @tweets = @group.tweets.includes(:user) 22 render :new 23 end 24 end 25 26 def show 27 end 28 29 def edit 30 unless user_signed_in? && current_user.id == @tweet.user_id 31 redirect_to root_path 32 end 33 end 34 35 def update 36 if @tweet.update(tweet_params) 37 redirect_to group_tweets_path(@group) 38 else 39 render :edit 40 end 41 end 42 43 def destroy 44 if current_user.id == @tweet.user_id 45 @tweet.destroy 46 redirect_to group_tweets_path(@group) 47 else 48 render :index 49 end 50 end 51 52 private 53 54 def tweet_params 55 params.require(:tweet).permit(:content, :image).merge(user_id: current_user.id) 56 end 57 58 def set_group 59 @group = Group.find(params[:group_id]) 60 end 61 62 def set_tweet 63 @tweet = @group.tweets.find(params[:id]) 64 end 65 66end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtomtomtom

2020/12/01 04:16

コントローラーをお見せいただくことは可能でしょうか?
shawn_709

2020/12/01 04:20

わざわざ見て頂き、ありがとうございます! tweetsコントローラーを追記しました。 また、ツイートはグループ内でしか投稿できないので、このような形になっています。
tomtomtomtom

2020/12/01 04:31

問題なさそうですね^^ railsのver.を教えていただいてもよろしいでしょうか? また、aplication.jsにpreviewを記載した理由をお聞きしてもよろしいですか?
tomtomtomtom

2020/12/01 04:35

あと一点。 preview.jsの位置をお伺いしてもよろしいでしょうか? 恐らくjavascriptフォルダ直下だと思いますが、、、
shawn_709

2020/12/01 04:37

railsは6.0.0です。 preview.jsを使うためにapplication.jsに書き込む必要があると思ったからです。 app/javascript/packsの中にpreview.jsとapplication.jsがあります。 何回もありがとうございます!!
tomtomtomtom

2020/12/01 04:42

あら?^^; 勘違いしました。 そしたら、preview.jsをjavascript直下に移動頂くことは可能でしょうか?
shawn_709

2020/12/01 05:06

移動しましたが、同じ結果でした。 すみません。何度もお答えいただいているのに。
tomtomtomtom

2020/12/01 05:11

javascriptフォルダ直下にpreview.jsを移動して require('preview.js')に書き直したんですよね?? あれ?? 問題ないようにおもうんだが、、、???
tomtomtomtom

2020/12/01 05:13

キャッシュの消去とハード再読み込みはされました?
shawn_709

2020/12/01 05:45

はい。やりましたが、うまく機能しませんでした。 すみません。「キャッシュの消去とハード再読み込み」とは何でしょうか? 素人で申し訳ないです。
tomtomtomtom

2020/12/01 06:19

例えばchromeで デベロッパーツール(検証)ツールを起動させます。 その状態でリロードボタンを右クリックするとわかるかと思います。
shawn_709

2020/12/01 06:24

「キャッシュの消去とハード再読み込み」をやってみましたが、何も変化がありませんでした。 すみません。何度も何度も・・・。
tomtomtomtom

2020/12/01 08:05

こちらこそ解決できずにすいません。 さて、preview.jsが読み込まれていないということを どのように確認されていますか?
shawn_709

2020/12/01 08:11

いえいえ、気にかけてくださるだけでありがたいです。 アプリが動くかどうかを試しています。具体的には 新規ツイート投稿ページで画像を添付する作業(添付・プレビュー表示共に問題ない) ツイート編集ページで画像を添付(元から添付されている画像がプレビューで表示されていない・画像を添付してもプレビュー表示されない・画像は編集できる) というような感じです。
tomtomtomtom

2020/12/01 08:20

なるほど。 console.log("hogehoge"); ↑これが無条件に動くようにしていただくことは可能ですか? これでコンソールを確認すれば本当に読み込まれているかいないかが判断できるかと思います。
tomtomtomtom

2020/12/01 08:23

ifの前に書いて頂くと有り難いです。
shawn_709

2020/12/01 10:23

ifの前に書きました! どのページに遷移しても無条件で動くことが確認できました。 しかし、プレビュー機能の状態は変わりませんでした。すみません。
tomtomtomtom

2020/12/01 10:46

ということは preview.jsが 読み込まれていることが確認出来たので 一歩前進じゃないですか^^ やりましたね!
tomtomtomtom

2020/12/01 20:55

おはようございます。 あれからコードを読んだのですが、 javascriptには tweet_image が change したらという イベントリスナーあるように思いますが view側にtweet_imageはありません。 それが原因では??
shawn_709

2020/12/02 01:54

おはようございます! 何度も解決しようとしてくださりありがとうございます! id: "tweet_image"に関しては、検証ツールのElementでみた時にidが記載されています。 今の状態で、newではjsが動くので、editページで読み込めていないのが原因だと考えています。
tomtomtomtom

2020/12/02 01:58

?? hogehogeはeditでもコンソールに表示されたんですよね?? ということは読み込めたのでは?? また、header部分が恐らくどのページも同じかと思いますので、editだけでは読み込まないとは考えにくいのですが、、、
tomtomtomtom

2020/12/02 02:20

一度、 DOMContentLoaded を load に変えて頂くことは可能でしょうか?
shawn_709

2020/12/02 03:05

hogehogeはif文の上に書いたので、どのページでも読み込めました。 if文のtweets/editの記述が何か影響しているのではないかと思います。(tweets/newは読み込めているので) loadに変えました。newでもプレビューが表示されなくなりました。
tomtomtomtom

2020/12/02 03:16

了解しました。 では >editページで読み込めていないのが原因だと考えています。 読み込めているようですので安心しました。 >loadに変えました。newでもプレビューが表示されなくなり うーん。おかしいですね^^; loadの方が確実かと思ったのですが お手数をおかけして申し訳有りませんでした。 >if文のtweets/editの記述が何か影響しているのではないかと思います。 では、if文の中に、console.logを書いてテスト出来るかと思います。
guest

回答3

0

お力になれず、誠に申し訳ありませんでした。

投稿2020/12/05 08:29

tomtomtomtom

総合スコア563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shawn_709

2020/12/05 08:31

ご尽力頂いたにも関わらず、解決できず申し訳ないです。 自分でもいろいろ試したのですが、全然だめでした。 ありがとうございました!!
guest

0

ベストアンサー

tweets#editのパスをコントローラーから/groups/:group_id/tweets/:id/editと推測します。

js

1"/groups/1/tweets/22/edit".match( "tweets/edit" ) // null

なのでif分の中が実行されないんじゃないかと思います。

js

1document.URL.match(//groups/\d+/tweets/\d+/edit/)

に変更してみてはどうでしょうか。

投稿2020/12/05 02:16

編集2020/12/05 03:25
neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shawn_709

2020/12/05 02:37

いつもありがとうございます! document.URL.match(/groups/\d+/tweets/\d+/edit/) とすればうまくいきました!ありがとうございます。 しかし、1つ問題が残っていまして・・・。 編集画面で新しい画像を添付すればそのプレビューは表示されるようになったのですが、 編集画面に遷移した時点で元から添付されている画像がプレビューされているようにしたいです。 ご助言頂けないでしょうか?重ね重ねすみません。
neko_daisuki

2020/12/05 03:34

@tweet.image に入っているのは画像のデータですか? パスなら簡単ですが、データだとちょっと大変かもしれません。 1.send_dataで画像のデータを送信する新たなアクションを作り img src でそのパスを指定する 2.画像データをBase64にエンコードしてimg srcに埋め込む のどちらかになると思います。
neko_daisuki

2020/12/05 03:51

あ、「edit.html.erb の初期状態で画像を表示しておく」のを前提に考えていました。 <div id="image-list"> <% if @tweet.image %> <img src="ここに何を書くかが問題"> <% end %> </div>
shawn_709

2020/12/05 07:10

neko_daisukiさんのご助言をヒントに以下のようにしてみたら、うまくいきました!! (#views/tweets/edit.html.erb) <div id="image-list"></div> <%= image_tag @tweet.image if @tweet.image.attached? %> 本当にいつもありがとうございます!!
neko_daisuki

2020/12/05 07:48

おめでとうございます。 質問の趣旨とはずれますが const imageContent = document.querySelector('img'); とすると、例えばヘッダに画像を追加した場合、それを取得し消しちゃうので const imageContent = ImageList.querySelector('img'); とした方が良いかもしれません。
shawn_709

2020/12/05 07:51

そういうことになるんですね。編集します! ありがとうございます!
guest

0

今のところ恐らくですが、
以下の記述が間違っているように思います。

require('./preview')

require('preview.js')

これで一度お試しいただくことは可能でしょうか?

投稿2020/12/01 04:38

tomtomtomtom

総合スコア563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問