rails6.1.0
heroku公式に、フロントエンドから直接S3へアップロードするjsのサンプルがあります。
jsはhtmlに直接ベタ書きになっています。
この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()を認識できていないようです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/09 05:05