サイトアイコン braveam

bootswatchでファイル選択のスタイルをリッチにする

概要

bootswatchとrails-assets-bootstrap-fileinputをつかって、ファイル選択の見た目をリッチにしたかったのですが、

gem 'bootstrap-sass'
gem 'bootswatch-rails'

↑このようなGemfile設定だとrails-assets-bootstrapと競合してしまい、

Incompatible units: 'rem' and 'px'.

↑とエラーがでてしまったので、以下のgemを使って解決しました。

Gemfile

source 'https://rails-assets.org' do
  gem 'rails-assets-bootstrap-sass-official'
  gem 'rails-assets-bootswatch-sass'
  gem 'rails-assets-bootstrap-fileinput'
end

app/views/share/_image_control.html.erb

<div class="row">
  <div class="field">
    <%= f.label :image, class: "control-label" %>
    <div id="image_control_area">
      <% if model.image? %>
        <div class="thumbnail">
          <%= image_tag model.image.url, id: 'image_preview' %>
        </div>
      <% end %>
    </div>
    <!-- 既存レコード(DBに保存されている)かつ、画像が存在する場合 -->
    <% if model.persisted? && model.image? %>
		  <div class="form-group">
        <div class="checkbox pull-right">
          <%= f.check_box :remove_image, class: 'checkbox' %>
          <%= f.label :remove_image, class: "control-label", style: "padding:0px" %>
        </div>
      </div>
    <% end %>
  </div>
</div>

<div class="row">
	<div class="form-group">
    <div class="field">
      <%= f.file_field :image %>
      <%= f.hidden_field :image_cache %>
    </div>
  </div>
</div>

<script>
 $("#<%= model.model_name.singular %>_image").fileinput({
   allowedFileExtensions: ["jpg", "png", "gif"],
   showUpload: false,
   showPreview: false,
   maxImageWidth: 3000,
   maxImageHeight: 3000,
   browseLabel: "ファイル選択",
   removeLabel: "削除",
   msgPlaceholder: "ファイル選択..."
 }).on('fileloaded', function(event, f, previewId, index, reader) {
   console.log("fileloaded");
   console.log(f);
   if( f != null && f.type.match('image.*')){
     var reader = new FileReader();
     //  Readerのロード完了時のハンドラ
     reader.onload = (function(){
       //  reader.resultにはファイルがdataURL化された文字列が入る
       $('#image_control_area').html('<div class="thumbnail"><img src="' + reader.result + '"></div>');
     });
     // dataURL形式で読み込み
     reader.readAsDataURL(f);
     // フィルタをはずす
     changeImageAreaCss( 0 );
   }else{
     $('#image_control_area').html('');
   }
 }).on('filecleared', function(event) {
   console.log("filecleared");
   $('#image_control_area').html('');
 });

 function changeImageAreaCss( fade_time )
 {
   if ($('#<%= model.model_name.singular %>_remove_image').is(':checked')) {
     $('#image_control_area').animate({'opacity': 0.2}, fade_time);
     return true;
	 } else {
     $('#image_control_area').animate({'opacity': 1}, fade_time);
     return false;
	 }
 }

 window.onload = function(){
   changeImageAreaCss( 0 );
 }

 $('#<%= model.model_name.singular %>_remove_image').change(function(){
   changeImageAreaCss( 100 );
 });
</script>

app/views/yourview/yourview.html.erb

<%= form_for(@your_model) do |f| %>

    <%= render partial: "share/image_control", locals: { f: f, model: @your_model } %>

<% end %>

モデルにはCarrywaveを使用しています。

class YourModel < ActiveRecord::Base
    mount_uploader :image, ImageUploader
end

 

結果

ファイル選択前

ファイル選択後

モバイルバージョンを終了