2013-07-22 72 views
32

在轨,我经常碰到那里的意见里面,我会做这样的事情如果.html.erb else语句中的观点

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

的情况下它看起来有点cluttery。这是一种可接受的处理意见的方式吗?

+9

您可以使用<% -%>避免空行被添加到生成的HTML代码。 –

回答

19

除非你能想办法重新写这个作为一个辅助方法,你基本上坚持了下来寻找一种丑陋。这就是ERB的原理,因为它旨在成为将Ruby注入纯文本模板的最小方式,而不是必须精简或优雅的东西。

好消息是语法高亮编辑器通常会让您的<% ... %> ERB块在外观上与您的HTML看起来不同,因此可以显着提高可读性。

这也是为什么其他表示像HAML已创建如该语法是少了很多混乱:

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

这种东西是我喜欢HAML而不是ERB的原因。 HAML摆脱混乱。 –

+0

我有一个HAML(我使用苗条)的问题。当你的HTML代码很短时,HAML语法就清晰简明。但是当代码很大时它会变得混乱。在使用某些IDE或插件时,您也无法格式化代码...... – hqt

+0

@hqt HAML是相当不错的,直到您的内联代码块变得太大,这是真的,但通常您可以通过编写帮助程序函数来减轻代码量,你有你的模板。正如你指出的那样,还有其他类似HAML的meta-HTML符号系统,所以如果你对ERB不满意,你可以选择。 – tadman

9

对于一个或两个这样的条件逻辑在你的意见,我想它的罚款,但是当你的代码获取更大,你有多个if..else..end,看起来“cluttery”,我认为你应该看看实施“Presenter模式”,通过将你的逻辑与演示者分开,大大清理你的视图。

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

+0

不错的链接,但对于我们这些没有付费帐户的人来说是不可见的。 =( –

+0

是的,我只关心如果我发布了github源代码链接是否会违反版权法,我会尝试发布一个链接到源代码并编辑我的答案以包含必要的类和文件以查看如果它不追我:) – vee

+0

它看起来像[情节287](https://github.com/ryanb/railscasts-episodes/tree/master/episode-287)至少在他的一个回购中公开。 –

3

你试过了吗?

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

您可以将逻辑总是移动到控制器和离开视图干净(ER)。

控制器:

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

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

查看:

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

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

如果你的状态是其中之一,那么它将使_one.html.erb

文件如果它是两个,然后它会自动呈现文件_two.html.erb。

型号:

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