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

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

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

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1337閲覧

jsをhtmlベタ書きから外部ファイルに移動するとUncaught TypeError: fileInput.fileupload is not a function

pecchan

総合スコア592

Ruby on Rails 6

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/07/24 12:00

編集2021/07/26 00:20

rails6.1.0

heroku公式に、フロントエンドから直接S3へアップロードするjsのサンプルがあります。
jsはhtmlに直接ベタ書きになっています。

Rails での S3 への画像の直接アップロード

このjsを外部に切り出して利用しようと試みましたが、読み込みに失敗しました。

コンソール

ncaught TypeError: fileInput.fileupload is not a function at HTMLInputElement.<anonymous> (direct_upload.js:11) at Function.each (jquery.js:304) at jQuery.fn.init.each (jquery.js:102) at HTMLDocument.<anonymous> (direct_upload.js:3) at HTMLDocument.dispatch (jquery.js:4589) at HTMLDocument.elemData.handle (jquery.js:4268) at Object../node_modules/turbolinks/dist/turbolinks.js.e.dispatch (turbolinks.js:75) at r.notifyApplicationAfterPageLoad (turbolinks.js:994) at r.pageLoaded (turbolinks.js:948) at turbolinks.js:872

外部ファイルに切り出したjs
app\javascript\packs\users\direct_upload.js

javascript

1$(document).on('turbolinks:load', function(){ 2 3 $('.directUpload').find("input:file").each(function(i, elem) { 4 var fileInput = $(elem); 5 console.log(fileInput); 6 var form = $(fileInput.parents('form:first')); 7 var submitButton = form.find('input[type="submit"]'); 8 var progressBar = $("<div class='bar'></div>"); 9 var barContainer = $("<div class='progress'></div>").append(progressBar); 10 fileInput.after(barContainer); 11 fileInput.fileupload({ 12 fileInput: fileInput, 13 url: '<%= @s3_direct_post.url %>', 14 type: 'POST', 15 autoUpload: true, 16 formData: '<%= @s3_direct_post.fields.to_json.html_safe %>', 17 paramName: 'file', 18 dataType: 'XML', 19 replaceFileInput: false, 20 progressall: function (e, data) { 21 var progress = parseInt(data.loaded / data.total * 100, 10); 22 progressBar.css('width', progress + '%') 23 }, 24 start: function (e) { 25 submitButton.prop('disabled', true); 26 27 progressBar. 28 css('background', 'green'). 29 css('display', 'block'). 30 css('width', '0%'). 31 text("Loading..."); 32 }, 33 done: function(e, data) { 34 submitButton.prop('disabled', false); 35 progressBar.text("Uploading done"); 36 37 // extract key and generate URL from response 38 var key = $(data.jqXHR.responseXML).find("Key").text(); 39 var url = '<%= @s3_direct_post.url %>/' + key; 40 41 42 // create hidden field 43 var input = $("<input />", { type:'hidden', name: fileInput.attr('name'), value: url }) 44 form.append(input); 45 }, 46 fail: function(e, data) { 47 submitButton.prop('disabled', false); 48 49 progressBar. 50 css("background", "red"). 51 text("Failed"); 52 } 53 }); 54 }); 55 56});

jsを呼んでるビュー側
app\views\users\edit.html.erb

ruby

1<%= javascript_pack_tag 'users/direct_upload' %> 2

エラーメッセージから、jQueryUIプラグインが読めてないっぽいですが、
htmlベタ書きだと正常に動作してます。

ちなみにjQueryUIは以下のようにインストールしました。何か関係してるでしょうか?

config/webpack/environment.js

javascript

1const { environment } = require('@rails/webpacker') 2 3// jQuery追加ここから 4const webpack = require('webpack') 5environment.plugins.prepend('Provide', 6 new webpack.ProvidePlugin({ 7 $: 'jquery', // jquery/src/jquery から jqeury に変更 8 jQuery: 'jquery' // jquery/src/jquery から jqeury に変更 9 }) 10) 11 12const aliasConfig = { 13 'jquery': 'jquery-ui/external/jquery/jquery.js', 14} 15environment.config.set('resolve.alias', aliasConfig); 16// jQuery追加ここまで 17 18module.exports = environment

どうすれば外部ファイルを利用できるようになるでしょうか?
分かる方教えていただけると幸いです。
宜しくお願い致します。

デバッグした内容を追加

javascriptの4行目で

javascript

1console.log(fileInput);

とすると、

jQuery.fn.init [input#target.upload-img__input, context: input#target.upload-img__input]

は出力できますが、

javascript

1console.log(fileInput.fileupload);

とすると、

undefined

となりました。
fileupload()を認識できていないようです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

jsプラグインの読み込みができていないように思われます。
jQuery, jQuery UI, jQuery-File-Uploadの3つのプラグインの読み込みが必要ですが、jqueryしか読み込めていないのではないでしょうか。
jQuery UI, jQuery-File-Uploadの読み込みについては一応クライアント側のコード項に書かれているようです。

投稿2021/08/02 04:15

webgoto

総合スコア1293

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

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

pecchan

2021/08/09 05:05

有難う御座います。 仰るとおり、プラグインだけが読み込まれてませんでした。 その読み込み方に苦戦しましたが、以下のようにするといけました。 require("blueimp-file-upload"); ※参考先は、どちらかと言うとrails5以前の方法
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問