如果.html.erb中的else语句在视图中

时间:2013-07-22 18:44:54

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

在rails中,我经常会遇到这样的情况,我会在其中执行类似

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

看起来有点乱。这是否是一种可接受的观看方式?

6 个答案:

答案 0 :(得分:20)

除非你能想出一种方法来重新编写这个作为辅助方法的方法,否则你基本上会坚持看起来有点难看。这就是ERB的方式,因为它是将Ruby注入其他纯文本模板的最小方式,而不是必须简化或优雅。

好消息是语法高亮编辑器通常会使您的<% ... %> ERB块看起来与HTML视觉上不同,这样可以显着提高可读性。

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

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

答案 1 :(得分:9)

对于你的观点中的一个或两个这样的条件逻辑,我猜它很好但是当你的代码变大并且你有多个if..else..end并且看起来“杂乱”时,我认为你应该看看实现“Presenter Pattern”通过将您的逻辑分离为演示者,可以极大地清理您的视图。

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

答案 2 :(得分:4)

你试过吗?

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

答案 3 :(得分:4)

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

查看:

<%= 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

答案 4 :(得分:1)

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

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

答案 5 :(得分:-2)

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

控制器:

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 %>