51

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

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

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

4

6 回答 6

27

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

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

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

- if some_condition_previusly_established_in_a_controller
  .one 123
- else
  .two something else
于 2013-07-22T18:47:20.180 回答
10

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

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

于 2013-07-22T18:51:22.350 回答
9

你有没有尝试过?

<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>
于 2014-11-03T19:17:51.387 回答
5

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

看法:

<%= render :partial => @model.status %>

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

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

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

模型:

def status
    if @some_condition
      "one"
    else
      "two"
    end
end
于 2015-12-11T19:00:13.980 回答
1

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

如果您正在寻找可能更清洁的替代方案,请查看:Rails / ERB 中的条件标签包装

于 2013-07-22T18:46:40.467 回答
-3

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

控制器:

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 %>
于 2014-11-27T09:33:58.657 回答