【问题标题】:If else statements in .html.erb in views视图中 .html.erb 中的 if else 语句
【发布时间】:2013-07-21 15:06:18
【问题描述】:

在 Rails 中,我经常遇到这样的情况:在视图中我会做类似的事情

<% if @some_condition_previusly_established_in_a_controller %>
 <div class="one">123</div>
<% else %>
 <div class="two">something else</div>
<% end %>

它看起来有点混乱。这是一种可接受的处理视图的方式吗?

【问题讨论】:

  • 您可以使用 来避免将空行附加到生成的 HTML 代码中。

标签: ruby-on-rails ruby model-view-controller


【解决方案1】:

除非您能想出一种将其重写为辅助方法的方法,否则您基本上会被它看起来有点难看。这就是 ERB 的样子,因为它旨在成为将 Ruby 注入其他纯文本模板的最小方式,而不是必然是精简或优雅的东西。

好消息是语法高亮编辑器通常会使您的 &lt;% ... %&gt; ERB 块在视觉上与您的 HTML 不同,从而可以显着提高可读性。

这也是为什么创建了其他表示形式(如 HAML)的原因,其中语法不那么混乱:

- if some_condition_previusly_established_in_a_controller
  .one 123
- else
  .two something else

【讨论】:

  • 这类东西是我更喜欢 HAML 而不是 ERB 的原因。 HAML 摆脱了混乱。
  • 我对 HAML 有疑问(我使用 slim)。当您的 html 代码很短时,HAML 语法清晰简洁。但是当代码很大时它会变得混乱。使用某些 IDE 或插件时,您也无法格式化代码 ....
  • @hqt HAML 非常好,直到您的内联代码变得太大,这是真的,但您通常可以通过编写帮助函数来减少模板中的代码量来缓解这种情况。正如您所指出的,还有其他类似 HAML 的元 HTML 符号系统,所以如果您对 ERB 不满意,您可以选择。
【解决方案2】:

对于您视图中的一两个这样的条件逻辑,我想这很好,但是当您的代码变得更大并且您有多个 if..else..end 并且看起来“混乱”时,我认为您应该考虑实现“Presenter Pattern”,这会大大通过将您的逻辑分离到 Presenters 来清理您的视图。

这是我从 Ryan Bates 在他的 Rails Casts 系列“从头开始演示者模式”中学习的一个很棒的教程。 http://railscasts.com/episodes/287-presenters-from-scratch.

【讨论】:

  • 不错的链接,但我们这些没有付费帐户的人无法查看。 =(
  • 是的,我只是担心如果我发布 github 源链接会违反版权法,我会尝试发布源链接并编辑我的答案以包含必要的如果它不追我,要查看的类和文件:)
  • 看起来episode 287 在他的至少一个仓库中是公开的。
  • @CharlesCaldwell,是的,您提供的链接确实包含演示者模式的实现。您要查找的文件位于app/presenters/app/helpers/application_helper.rb 中,其中一种用法可以在app/views/users/show.html.erb 中找到。在profile-after 中查看它们。
【解决方案3】:

你试过了吗?

<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>

【讨论】:

    【解决方案4】:

    如果您的视图包含大量标签和 HTML 元素,您可以将它们放入 partials 并将逻辑放入模型中

    查看:

    <%= render :partial => @model.status %>
    
    <%= render :partial => "file/path/#{@model.status}" %> # if your partial is in some different folder
    

    如果您的状态为 1,那么它将呈现文件 _one.html.erb

    如果是两个,那么它会自动渲染文件_two.html.erb。

    型号:

    def status
        if @some_condition
          "one"
        else
          "two"
        end
    end
    

    【讨论】:

      【解决方案5】:

      是的,这是标准(是的,它看起来很混乱)。

      如果您正在寻找可能更清洁的替代品,请查看:Conditional tag wrapping in Rails / ERB

      【讨论】:

        【解决方案6】:

        您始终可以将逻辑移至控制器并保持视图干净(呃)。

        控制器:

        if @some_condition
          @div_class = :one
          @div_content = 123
        else
          @div_class = :two
          @div_content = 'something else'
        end
        

        查看:

         <div class="<%= @div_class %>"><%= @div_content %></div>
        

        或者使用助手:

         <%= content_tag :div, @div_content, class: @div_class %>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 2015-10-28
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多