Rails中的条件语句

时间:2011-03-04 16:45:44

标签: ruby-on-rails ruby

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

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

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

<% else %>

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

非常感谢任何帮助。感谢

5 个答案:

答案 0 :(得分:7)

布尔列的值在ruby中为falsetrue,而不是01。所以你应该这样做:

<% if @listing.show_weekly %>

而不是<% if @listing.show_weekly == 1 %>

答案 1 :(得分:3)

我建议在模型中添加方法

def print_price

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

end

答案 2 :(得分:2)

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

答案 3 :(得分: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中只有两个值评估为 false,因此通常情况下,任何不正确的值都是nil。有时你会有布尔列,如果没有定义,可以是truefalsenil,但这很不寻常,可能会使人绊倒。

答案 4 :(得分:0)

如果@listing.show_weekly包含布尔值,则只测试true:

<% if @listing.show_weekly %>

.....

<% else %>

....

<% end %>

请注意,您甚至不需要“== true”。这是因为IF语句只查看是否从其后面的任何表达式返回true值。如果@listing.show_weekly包含true的值,则所有IF语句都会看到您是否提供了它。