ピスタチオを食べながらrailsを楽しむ

ピスタチオ大好きな著者のrailsを使ったツール作成の日記です。

Bootstrapのfile inputをキレイに整える(Rails4,form-horizontal)

他にも記事はたくさんあるがRails4でgemを使わない方法が見つからなかったので備忘録のために投稿。

  • 実際にfileをアップロードするためのフィールドは隠す
  • 隠したフィールドを使うためにbtn(又はlabel)にclassを指定し擬似的にクリックさせる
  • 実際にアップロードされたファイルパスを擬似的なtextフィールドに表示させる

まずはview側。

# app/views/files/new.html.erb
<div id="set_file">
  <%= form_tag import_file_path, class: "form-horizontal", multipart: true do %>

    <%= file_field_tag :file, id: "hide_input_file", class: "hide" %> #=> 実際にfileをアップロードするfieldは隠す

    <div class="form-group">
      <%= label_tag :file, "CSVファイル", class: "control-label col-sm-2 file_upload" %> #=>classにfile_uploadを指定
      <span class="col-sm-10">
      <span class="input-group">
        <input id="show_input_file" class="form-control" disabled> #=>表示用にidにshow_input_fileを指定
        <span class="input-group-btn">
          <button class="btn btn-default file_upload" type="button"> #=>classにfile_uploadを指定
          <i class="glyphicon glyphicon-folder-open"></i>
        </span>
      </span>
      </span>
    </div>
    <div class="form-group">
      <span class="col-sm-offset-2 col-sm-10">
        <%= submit_tag "アップロード", class: "btn btn-primary" %>
      </span>
    </div>
  <% end %>
</div>

次にjs側。

// app/assets/javascripts/files.js.coffee
$ ->    
  $('#set_file')
    .on "click", ".file_upload", (e) ->
      $('#hide_input_file').click()
// .file_uploadをクリックしたら#hide_input_fileをクリックする
      
    .on "change", "#hide_input_file", (e) ->
      $('#show_input_file').val($('#hide_input_file').val())
// #hide_input_fileの値が変わったら#show_input_fileにその値を適用する