form_withからファイルのダウンロード後に、htmlにdisable
が足されたsubmitを、再度有効化させる方法を探しています。
stackoverflow:Data Disable With not enable button after a send a file
こちらにも、同じような状況の質問がありますが、有力な回答はないようです。
構成
ダウンロードファイルはexcelで、gemを使って生成しています。
Gemfile
1gem 'caxlsx' 2gem 'caxlsx_rails'
erb
1<!-- partial view --> 2<%= form_with(url: url, method: :get, local: true) do |form| %> 3 <%= form.fields_for :filter do |f| %> 4 <%= f.hidden_field :from, value: from %> 5 <%= f.hidden_field :to, value: to %> 6 <% end %> 7 <%= form.submit t(".download"), data: { disable_with: t(".loading") } %> 8<% end %>
ruby
1# users_controller 2respond_to do |format| 3 format.html 4 format.js 5 format.xlsx do 6 filename = "Users_#{Time.now.strftime('%F_%H-%M-%S')}.xlsx" 7 render xlsx: 'download', filename: "#{filename}" 8 end 9end
# users/download.xlsx.axlsx workbook = xlsx_package.workbook workbook.add_worksheet(name: User.model_name.human) do |sheet| sheet.add_row [ User.human_attribute_name(:id), User.human_attribute_name(:name) ] @users.each_with_index do |user, index| sheet.add_row [ user.id, user.name ] end end
試したこと
disable_with: false
stackoverflow:Submit button disabled after rendering create action rails
sbumitのdisable_with
オプションをfalse
にする方法ですが、この場合処理の完了を待たずに何度もリクエストを送れてしまいます。
ajax / $.get
Qiita:[Rails5] submitタグでAjaxを使うと2回目以降に無効になる
javascriptでリクエストさせ、完了時にdisableを外すやり方ですが、今回の場合はファイルのダウンロードのため、javascriptから行うことは出来ません。
$(window).on("~~~", function(){})
Re-enable submit buttons disabled by the :disable_with option
stackoverflow:Re-enable links disabled with disable_with
こちらもjavascriptでページの更新をハンドルして、もとに戻す方法ですが、
ファイルダウンロードではunload
,page:change
などは反応しないようでした。
setTimeout
submitされたときに、それを戻すfunctionをセットします。
ある意味では確実ですが、レコード数や通信速度によってダウンロードに時間が掛かる場合などに対応できません。
erb
1<script type="text/javascript"> 2 $(function() { 3 var form = $("form#download_form"); 4 var submit = $(form).find('input[type="submit"]'); 5 6 $(form).on('submit', function(e) { 7 setTimeout(function(){ 8 console.log("timer function"); 9 submit.removeAttr("disabled"); 10 submit.val( "<%= t(".download") %>" ); 11 }, 3000); 12 }); 13 }); 14</script>
他
その他にも、download.xlsx.axlsx
内でjavascriptを実行できないか調べていましたが、上手いようにはなりませんでした。
download.xlsx.axlsx
をdownload.js.erb
からrenderし、同時にjsを実行する、というのも
そもそもcontrollerからrenderされるのがxlsxでないといけないので、駄目そうでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。