ご回答いただけるとありがたいです。よろしくお願いします!
実現したいこと
・ツイート編集ページで画像をプレビューで表示する
・編集画面に遷移した時点で画像が添付されていたら、プレビューで表示されている状態にする
発生している問題
ツイート新規投稿ページでは、プレビューが表示されています。
しかし、編集ページをコンソールで見たら、そもそも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
コントローラーをお見せいただくことは可能でしょうか?
わざわざ見て頂き、ありがとうございます!
tweetsコントローラーを追記しました。
また、ツイートはグループ内でしか投稿できないので、このような形になっています。
問題なさそうですね^^
railsのver.を教えていただいてもよろしいでしょうか?
また、aplication.jsにpreviewを記載した理由をお聞きしてもよろしいですか?
あと一点。
preview.jsの位置をお伺いしてもよろしいでしょうか?
恐らくjavascriptフォルダ直下だと思いますが、、、
railsは6.0.0です。
preview.jsを使うためにapplication.jsに書き込む必要があると思ったからです。
app/javascript/packsの中にpreview.jsとapplication.jsがあります。
何回もありがとうございます!!
あら?^^;
勘違いしました。
そしたら、preview.jsをjavascript直下に移動頂くことは可能でしょうか?
移動しましたが、同じ結果でした。
すみません。何度もお答えいただいているのに。
javascriptフォルダ直下にpreview.jsを移動して
require('preview.js')に書き直したんですよね??
あれ??
問題ないようにおもうんだが、、、???
キャッシュの消去とハード再読み込みはされました?
はい。やりましたが、うまく機能しませんでした。
すみません。「キャッシュの消去とハード再読み込み」とは何でしょうか?
素人で申し訳ないです。
例えばchromeで
デベロッパーツール(検証)ツールを起動させます。
その状態でリロードボタンを右クリックするとわかるかと思います。
「キャッシュの消去とハード再読み込み」をやってみましたが、何も変化がありませんでした。
すみません。何度も何度も・・・。
こちらこそ解決できずにすいません。
さて、preview.jsが読み込まれていないということを
どのように確認されていますか?
いえいえ、気にかけてくださるだけでありがたいです。
アプリが動くかどうかを試しています。具体的には
新規ツイート投稿ページで画像を添付する作業(添付・プレビュー表示共に問題ない)
ツイート編集ページで画像を添付(元から添付されている画像がプレビューで表示されていない・画像を添付してもプレビュー表示されない・画像は編集できる)
というような感じです。
なるほど。
console.log("hogehoge");
↑これが無条件に動くようにしていただくことは可能ですか?
これでコンソールを確認すれば本当に読み込まれているかいないかが判断できるかと思います。
ifの前に書いて頂くと有り難いです。
ifの前に書きました!
どのページに遷移しても無条件で動くことが確認できました。
しかし、プレビュー機能の状態は変わりませんでした。すみません。
ということは
preview.jsが
読み込まれていることが確認出来たので
一歩前進じゃないですか^^
やりましたね!
おはようございます。
あれからコードを読んだのですが、
javascriptには
tweet_image が change したらという
イベントリスナーあるように思いますが
view側にtweet_imageはありません。
それが原因では??
おはようございます!
何度も解決しようとしてくださりありがとうございます!
id: "tweet_image"に関しては、検証ツールのElementでみた時にidが記載されています。
今の状態で、newではjsが動くので、editページで読み込めていないのが原因だと考えています。
??
hogehogeはeditでもコンソールに表示されたんですよね??
ということは読み込めたのでは??
また、header部分が恐らくどのページも同じかと思いますので、editだけでは読み込まないとは考えにくいのですが、、、
一度、
DOMContentLoaded
を
load
に変えて頂くことは可能でしょうか?
hogehogeはif文の上に書いたので、どのページでも読み込めました。
if文のtweets/editの記述が何か影響しているのではないかと思います。(tweets/newは読み込めているので)
loadに変えました。newでもプレビューが表示されなくなりました。
了解しました。
では
>editページで読み込めていないのが原因だと考えています。
読み込めているようですので安心しました。
>loadに変えました。newでもプレビューが表示されなくなり
うーん。おかしいですね^^;
loadの方が確実かと思ったのですが
お手数をおかけして申し訳有りませんでした。
>if文のtweets/editの記述が何か影響しているのではないかと思います。
では、if文の中に、console.logを書いてテスト出来るかと思います。
回答3件
あなたの回答
tips
プレビュー