【问题标题】:How do I DRY up this view with a concern or helper or something?我如何用关心或帮助者或其他东西来干掉这个观点?
【发布时间】:2014-11-04 15:32:35
【问题描述】:

我有一个带有文件附件的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

我还希望能够轻松检测扩展名是什么类型的文件,然后对其进行一些行为。这个图标版本只是一个应用程序。

另一个例子是我的分享按钮。根据附加文件的类型,我想添加共享标题中包含的文件的名称。比如:

如果没有这个逻辑,我的 Twitter 分享图标看起来像这样:

  <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;
}

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 dry view-helpers


    【解决方案1】:

    您可能正在使用 LESS 或 SASS,因此 CSS 会在这里拯救您。对于 SASS,例如

    .whatever-pdf {
      @extend .fa-file-pdf-o;
    }
    

    由于您使用的是 FontAwesome 图标,因此请确保在包含 @import FontAwesome 调用的 .scss 中声明这些类。在你的情况下,它似乎是bootstrap_and_overrides.css.scss

    然后,在您的视图中,它会汇总为:

    <i class="fa whatever-#{post.file.file.extension.downcase}"></i>
    

    仅此而已。

    编辑 1:

    EN 语言环境的示例:

    # config/locales/en.yml:
    en:
      posts: 
        file_has_been_included: "(your %{file} has been included)"
      extensions:
        pptx: powerpoint presentation
        # ...
    
    #view:
      <a class="btn btn-twitter" href='http://twitter.com/home?status=<%=u "#{post.title} #{t("posts.file_has_been_included", file: t("extensions.#{post.file.file.extension.downcase}"))} - Read more at #{post_url(post)}" %>' title="Share on Twitter" target="_blank"></a>
    

    【讨论】:

    • 所以我会为我的.scss 文件中的所有扩展创建这些规则?你介意为我的所有规则编辑这个,这样我就可以确切地知道我的 SASS 文件会是什么样子?谢谢!
    • 是的,当然还有另一种解决方案,包括在你的助手中添加一些逻辑,但这里没有必要。这肯定是最快的。
    • 这是一个不错的优雅解决方案。我遇到的问题是我想做一些更复杂的事情。我刚刚更新了我的问题。您能否修改您的答案以包括一种方法?谢谢!
    • 所以最终#{post.title} (#{post.file.file.extension.upcase} Included) - ... 延伸到blah blah (PPTX included)。好吧,你可以在这里使用你的语言环境,那会更优雅。使用I18n 会是#{post.title} (#{t("something.something.pptx") } Included) - ...,这会给blah blah (your powerpoint presentation has been included) - ... 更好,不是吗?
    • 听起来不错。您介意在答案中更详细地显示它吗?谢谢!编辑:包括我在 I18n 文件中放入的内容等。
    【解决方案2】:

    你多次写了 post.file.file.extension.downcase。你可以在一个新变量中声明它

    filename = post.file.file.extension.downcase
    

    你需要使用 case when 语句而不是 if else 语句

    <% if post.file? %>
    <% case filename %>
    <% when filename =~ /mp3|wav/ %>
        <i class="fa fa-file-audio-o"></i>
    <% when filename =~ /pdf/ %>
        <i class="fa fa-file-pdf-o"></i>
    <% when filename =~ /txt/ %>
        <i class="fa fa-file-text-o"></i>
    <% when filename =~ /doc|docx/ %>
        <i class="fa fa-file-word-o"></i>
    <% when filename =~ /xls|xlsx/ %>
        <i class="fa fa-file-excel-o"></i>
    <% when filename =~ /ppt|pptx/ %>
        <i class="fa fa-file-powerpoint-o"></i>
    <% when filename =~ /mp4|m4v|mov|avi|mkv/ %>
        <i class="fa fa-file-video-o"></i>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多