ファイルのアップロードをモーダルウィンドウで処理する。
現状では、アップロードしたいファイルが複数ある場合、1ファイルをアップロードするごとにリストページに戻ってしまい、何度も「CSVファイルのアップロード」リンクをクリックする羽目になる。そこで効率的なアップロードを目指して、アップロードが終わっても、そのままアップロードページに戻るようにしてみた。
すると今度は、2、3のファイルならまだ良いが、それ以上いっぺんにアップロードしていると、どこまでアップロードしたのか分からなくなってしまう。結局、不安になって、リストページに戻って、確認して、という無駄な操作をしていた。
こんな時は、モーダルウィンドウの出番です!アップロードページの外側には、リストページが透過されているので、自信を持ってアップロード作業を続けられる。早速、モーダルウィンドウ化してみる。
- app/views/csvs/list.rhtml
- ビュー
- 「CSVファイルのアップロード」リンクに:id=>'modal_upload'を追記した。
- ページの最後で、modal_window_id 'modal_upload'を宣言した。(上記リンクをクリックした時はモーダルウィンドウで表示する指定)
- ファイルのアップロードは、ajax更新では処理できないようなので、:iframe=>trueを指定しておいた。
<% if controller.action_name == 'list' %>
<% if admin? || uploader? %> <%= link_to 'CSVファイルのアップロード', {:action => 'new', :sort_field => params[:sort_field], :sort_direction => params[:sort_direction], :page => params[:page]}, :id=>'modal_upload' %> <% end %>...(途中省略)... <%= modal_window_id 'modal_upload', :iframe=>true, :width=>640, :height=>480 %>
- app/views/csvs/new.rhtml
- ビュー
- 「戻る」リンクを、モーダルウィンドウを閉じる「キャンセル」リンクに変更した。
- newページの最後に、背景に透過している親ウィンドウを更新するためのjavascriptを追記した。
- モーダルウィンドウから背景の親ウィンドウを更新する場合、親ウィンドウ中のid="list_params"の範囲をパラメーターとして送信する必要がある。
- その場合、parameters:に次のようにparentを追記するとうまくいった。parameters:parent.Form.serialize('list_params')
- 以前、モーダルウィンドウを親ウィンドウと連動させた時は、このparentが抜けていて、うまく動いていなかった...。ここで気付いたのでparentを追記しておいた。
<div class="new_update"> <h1>CSVファイルのアップロード</h1> <%= start_form_tag({:action => 'create'}, :multipart => true) %> <%= render :partial => 'form' %> ...(途中省略)... <%#= link_to '戻る', :action => 'list', :sort_field => params[:sort_field], :sort_direction => params[:sort_direction], :page => params[:page] %> <%= link_to_function 'キャンセル', "parent.Control.Modal.close();" %> | <%= submit_tag "アップロード" %> <%= end_form_tag %> <%= javascript_tag("new parent.Ajax.Updater('list_update', '/csvs/list_update', {asynchronous:true, evalScripts:true, parameters:parent.Form.serialize('list_params')});") %> </div>
以上で、CSVファイルのアップロードページのモーダルウィンドウ化、完了!モーダルウィンドウが簡単に使えると、予想以上に便利だ!今後、多用してしまいそう...。