2011-03-04 98 views
3

我试图根据条件获取一些代码来显示。我在名为“show_weekly”的表中有一个布尔字段。我正在尝试的是:如果列== 1然后显示第一行,否则显示第二行代码。由于某些原因,它只显示第二行。Rails中的条件语句

<% if @listing.show_weekly == 1 %> 

<%= number_to_currency(@listing.price/4, :unit => "&pound;") %>/week 

<% else %> 

<%= number_to_currency(@listing.price, :unit => "&pound;") %>/month 
<% end %> 

任何帮助,非常感谢。感谢

回答

2

你需要检查它是否等于true,不1

+0

感谢。那工作。 – hanumanDev 2011-03-04 16:56:02

+2

这很有效,但你可以摆脱'== true'。 – 2011-03-06 22:26:46

+0

好电话@安德鲁 – William 2011-03-07 14:14:36

7

一个布尔列的值将位于红宝石falsetrue,不01。所以,你应该做的:的

<% if @listing.show_weekly %> 

代替<% if @listing.show_weekly == 1 %>

0

如果@listing.show_weekly包含了一个布尔值,只是测试真:

<% if @listing.show_weekly %> 

..... 

<% else %> 

.... 

<% end %> 

通知你甚至都不需要 “== true”。这是因为IF语句仅查看是否存在从其后的任何表达式返回的true值。如果@listing.show_weekly包含值true那么这就是所有的IF语句,看看你是否提供了它。

2

一个布尔值是存储为1或0,而是从模型被返回之前总是被解释为truefalse。这是一个混乱的来源。

使用访问器方法show_weekly?可以提供帮助,因为方法名中的问号通常表示它将返回布尔值,或者可以评估为布尔值的东西。

这将是一个很大更具可读性,如果您有:

<% if @listing.show_weekly? %> 
    ... 
<% else %> 
    ... 
<% endif %> 

尽可能避免比较具体的硬编码值。举例来说,下面是多余的,但我看到这一切的时候:

# Example: Comparison to nil 
if (@something == nil) 

# Should be: Checking if initialized 
if (@something) 

# Example: Comparison to true 
if (@something == true) 

# Should be: Testing directly 
if (@something) 

由于只有两个值是评估为在Ruby中,nilfalse假的,所以一般情况下,任何的不是真的是零。有时你会有布尔列,如果它没有被定义,它可以是true,falsenil,但是这是不常见的,并且可能让人们感到不安。

3

我建议你添加一个方法到模型

def print_price 

    @p = this.show_weekly? ? this.price/4 : this.price 
    number_to_currency (@p, :unit => "&pound;") 

end