質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

JavaScript

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

1310閲覧

Uncaught TypeError: Cannot read property 'top' of undefined の該当エラー箇所がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

JavaScript

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2020/05/05 06:09

編集2020/05/05 09:33

## 現状
ローカルでは出なかったエラーが本番環境で出てきました。

私が今作成している個人アプリはLINEのようなチャット形式の機能を作成しています。その際にメッセージを飛ばすと下にスクロールするように作成しているのですが調べてみるとどうやらその機能が悪影響を与えているとのこと。

しかし、ローカルで動くjsが本番では動かないということは他にも原因がありそうなのですがそれがわかりません。

## 問題

js

1message.js 2 3$(document).on('turbolinks:load', function(){ 4 function buildHTML(message) { 5 let img = message.user_image ? `${ message.user_image }` : "/images/log/bctalk.png"; 6 let content = message.content ? `${ message.content }` : ""; 7 let id = $('.current_user_name').val(); 8 9 function leftright(){if (id==message.user_id) { 10 return right = "right"; 11 } else { 12 return left = "left"; 13 }} 14 let html = `<div class="message" data-message-id=` + message.id + `>` + 15 `<div class="${leftright()}"> 16 <div class="${leftright()}__message"> 17 <div img src="${img}"></div> 18 19 <span class="${leftright()}__message__content"> 20 ${content} 21 </span> 22 </div> 23 <div class="${leftright()}__title"> 24 <div class="${leftright()}__title__name">` 25 + message.user_name + 26 `</div> 27 <div class="${leftright()}__title__date"> 28 ${message.date} 29 </div> 30 </div> 31 </div> 32 </div> 33 <br>` 34return html; 35 } 36 37 38 $('#new_message').on('submit', function(e){ 39 40 e.preventDefault(); 41 var message = new FormData(this); //フォームに入力した値を取得しています。 42 var url = (window.location.href) + '/messages'; 43 $.ajax({ 44 url: url, 45 type: 'POST', 46 data: message, 47 dataType: 'json', 48 processData: false, 49 contentType: false 50 }) 51 .done(function(data){ 52 var html = buildHTML(data); 53 $('.messages').append(html); 54 $('#message_content').val(''); //input内のメッセージを消しています。 55 56 function scrollBottom(){ 57 var target = $('.message').last(); 58 var position = target.offset().top + $('.messages').scrollTop(); 59 $('.messages').animate({ 60 scrollTop: position 61 }, 300, 'swing'); 62 } 63 scrollBottom(); 64 }) 65 .fail(function(){ 66 alert('エラーが発生したためメッセージは送信できませんでした。'); 67 }) 68 .always(function(){ 69 $('.input__submit').prop('disabled', false);//ここで解除している 70 }) 71 }) 72});

こちらは動的カテゴリーボックスのためのjs

$(function(){ $(document).on('turbolinks:load', ()=> { // 画像用のinputを生成する関数 const buildFileField = (num)=> { const html = `<div data-index="${num}" class="js-file_group"> <label class='label'> <i class='fa fa-image icon'></i> <input class="js-file" type="file" name="post[images_attributes][${num}][src]" id="product_images_attributes_${num}_src"> </label> <br> <div class="js-remove">削除</div> </div>`; return html; } // プレビュー用のimgタグを生成する関数 const buildImg = (index, url)=> { const html = `<img data-index="${index}" src="${url}" width="100px" height="100px">`; return html; } // file_fieldのnameに動的なindexをつける為の配列 let fileIndex = [1,2,3,4,5,6,7,8,9,10]; // 既に使われているindexを除外 lastIndex = $('.js-file_group:last').data('index'); fileIndex.splice(0, lastIndex); $('.hidden-destroy').hide(); $('#image-box').on('change', '.js-file', function(e) { const targetIndex = $(this).parent().parent().data('index'); console.log(targetIndex) // ファイルのブラウザ上でのURLを取得する const file = e.target.files[0]; const blobUrl = window.URL.createObjectURL(file); // 該当indexを持つimgがあれば取得して変数imgに入れる(画像変更の処理) if (img = $(`img[data-index="${targetIndex}"]`)[0]) { img.setAttribute('src', blobUrl); } else { // 新規画像追加の処理 $('#previews').append(buildImg(targetIndex, blobUrl)); // fileIndexの先頭の数字を使ってinputを作る //ここに制限を記述する。 $('#image-box').append(buildFileField(fileIndex[0])); fileIndex.shift(); // 末尾の数に1足した数を追加する fileIndex.push(fileIndex[fileIndex.length - 1] + 1); } }); $('#image-box').on('click', '.js-remove', function() { const targetIndex = $(this).parent().data('index'); // 該当indexを振られているチェックボックスを取得する const hiddenCheck = $(`input[data-index="${targetIndex}"].hidden-destroy`); // もしチェックボックスが存在すればチェックを入れる if (hiddenCheck) hiddenCheck.prop('checked', true); $(this).parent().remove(); $(`img[data-index="${targetIndex}"]`).remove(); // 画像入力欄が0個にならないようにしておく if ($('.js-file').length == 0) $('#image-box').append(buildFileField(fileIndex[0])); }); }); }

やったこと

awsがおかしいのかと思いインスタンスの再作成と再起動。
message.jsのスクロールfunctionの移動。

を行いましたが変化はありませんでした。

#### 追記
message.jsを呼び出しているファイルです。

.messages -if @messages -@messages.each do |message| .message{"data-message-id": "#{message.id}"} -if message.user.id == current_user.id .right .right__message %p.right__message__content =safe_join(message.content.split("\n"),tag(:br)) .right__title .right__title__date = message.created_at.strftime("%Y年%m月%d日 %H時%M分") -else .left .left__message =image_tag asset_path(message.user.image) %span.left__message__content =safe_join(message.content.split("\n"),tag(:br)) .left__title -if message.user .left__title__name = message.user.nickname .left__title__date = message.created_at.strftime("%Y年%m月%d日 %H時%M分") %br/ .contents__footer = form_for [@group, @message] do |f| .input = f.text_area :content, placeholder: "type a message",class: "input__text" ,required: true = f.label :submit do %i.fas.fa-paper-plane.icon = f.submit class: "input__submit" ,id:'message_submit'

こちらのsubmitでイベントを発火させています。

また動的カテゴリーボックスの方は新規登録画面で使用しおり、本番環境では動きません。

registration/new .form = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| = render "devise/shared/error_messages", resource: resource ,class: 'error' .form__field ニックネーム %br/ = f.text_field :nickname, autofocus: true, autocomplete: "nickname",required: true,class:'input' .form__field = f.label :email %br/ = f.email_field :email, autocomplete: "email",required: true,class:'input' .form__field = f.label :password - if @minimum_password_length %em (#{@minimum_password_length} 以上) %br/ = f.password_field :password, autocomplete: "new-password" ,required: true,class:'input' .form__field = f.label :password_confirmation %br/ = f.password_field :password_confirmation, autocomplete: "new-password" ,required: true,class:'input' #InId.form__field 業界 %br/ = f.collection_select :industry_id, Industry.all.where(ancestry: nil).limit(14), :id, :name,{prompt: "選択してください"}, name: '',id: "Industry-form",selected:true,required:true #OcId.form__field 職種 %br/ = f.collection_select :occupation_id, Occupation.all.where(ancestry: nil).limit(15), :id, :name,{prompt: "選択してください"}, name: '',id: "Occupation-form",selected:true,required:true .actions = f.submit "save",class:'save'

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

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

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

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

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

coco_bauer

2020/05/05 06:31

質問に書かれているJavascriptの関数は、どこから、どのようにして、呼び出されるのですか? ローカルの環境と、本番環境では、それぞれ、どこに何が配置され、二つの環境での違いは何ですか?
退会済みユーザー

退会済みユーザー

2020/05/05 09:35

コメントありがとうございます。 どこからどのようにしてに関しては追記させていただきました。 ローカル環境と本番環境の配置場所は同じです。二つの環境での違いはわからないので即答出来ないです。
guest

回答1

0

本番では該当画面へ表示するデータがまだない
データがないと class="message" な要素がない

ってことでは?

投稿2020/05/05 08:20

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問