У меня есть Post
с вложенными файлами через Carrierwave.
На мой взгляд, в зависимости от типа вложения я хочу, чтобы отображался другой значок.
Итак, вот что я придумал, что теперь работает нормально, но довольно неприлично и не СУХО.
Как упростить это и сделать более похожим на Rails?
<% if post.file? %>
<% if post.file.file.extension.downcase =~ /mp3|wav/ %>
<i class="fa fa-file-audio-o"></i>
<% elsif post.file.file.extension.downcase =~ /pdf/ %>
<i class="fa fa-file-pdf-o"></i>
<% elsif post.file.file.extension.downcase =~ /txt/ %>
<i class="fa fa-file-text-o"></i>
<% elsif post.file.file.extension.downcase =~ /doc|docx/ %>
<i class="fa fa-file-word-o"></i>
<% elsif post.file.file.extension.downcase =~ /xls|xlsx/ %>
<i class="fa fa-file-excel-o"></i>
<% elsif post.file.file.extension.downcase =~ /ppt|pptx/ %>
<i class="fa fa-file-powerpoint-o"></i>
<% elsif post.file.file.extension.downcase =~ /mp4|m4v|mov|avi|mkv/ %>
<i class="fa fa-file-video-o"></i>
<% end %>
<% end %>
Изменить 1
Я также хотел бы иметь возможность легко определять тип файла с расширением, а затем выполнять с ним какое-то действие. Эта версия значка - всего лишь одно приложение.
Другой пример — мои кнопки «Поделиться». В зависимости от типа прикрепленного файла я хочу добавить имя файла, включенного в заголовок общего ресурса. Так, например:
Моя иконка «Поделиться в Твиттере» без этой логики выглядела бы примерно так:
<a class="btn btn-twitter" href='http://twitter.com/home?status=<%=u "#{post.title} - Read more at #{post_url(post)}" %>' title="Share on Twitter" target="_blank">
<i class="fa fa-twitter"></i>
</a>
С логикой:
<% if post.file? %>
<a class="btn btn-twitter" href='http://twitter.com/home?status=<%=u "#{post.title} (#{post.file.file.extension.upcase} Included) - Read more at #{post_url(post)}" %>' title="Share on Twitter" target="_blank">
<i class="fa fa-twitter"></i>
</a>
<% end %>
Есть ли более элегантный, Railsy способ подойти к этому?
Изменить 2
С прекрасным элегантным решением @blelump, которое мне нравится, я пытаюсь сделать следующее:
<i class='fa attached-<%= post.file.file.extension.downcase %>'></i>
Где в моем post.css.scss
у меня такие правила:
.attached-mp3, .attached-wav {
@extend .fa-file-audio-o;
}
.attached-pdf {
@extend .fa-file-pdf-o;
}
.attached-txt {
@extend .fa-file-text-o;
}
Проблема в том, что HTML-код, создаваемый этим, таков:
<i class="fa attached-txt"></i>
Кажется, он не вызывает @extend .fa-file-text-o
.
Как я могу это исправить?
Изменить 3
Вот как мой post.css.scss
выглядит после предложений @blelump:
.field_report{
width: 100%;
}
.field_report #report_box{
width: 100%;
height: 250px;
}
.attached-mp3, .attached-wav {
@extend .fa-file-audio-o;
}
.attached-pdf {
@extend .fa-file-pdf-o;
}
.attached-txt {
@extend .fa-file-text-o;
}
.attached-doc, .attached-docx {
@extend .fa-file-word-o;
}
.attached-xls, .attached-xlsx {
@extend .fa-file-excel-o;
}
.attached-ppt, .attached-pptx {
@extend .fa-file-powerpoint-o;
}
.attached-mp4, .attached-m4v, .attached-mov, .attached-mkv, .attached-avi {
@extend .fa-file-video-o;
}