我正在尝试根据条件显示一些代码。我在名为“show_weekly”的表中有一个布尔字段。我正在尝试的是:如果列== 1然后显示第一行,则显示第二行代码。由于某种原因,它只显示第二行。
<% if @listing.show_weekly == 1 %>
<%= number_to_currency(@listing.price/4, :unit => "£") %> / week
<% else %>
<%= number_to_currency(@listing.price, :unit => "£") %> / month
<% end %>
非常感谢任何帮助。感谢
答案 0 :(得分:7)
布尔列的值在ruby中为false
或true
,而不是0
或1
。所以你应该这样做:
<% 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 => "£")
end
答案 2 :(得分:2)
您需要检查它是否等于true
,而不是1
答案 3 :(得分:2)
布尔值存储为1或0,但在从模型返回之前,它始终被解释为true
或false
。这引起了很多困惑。
使用访问器方法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,nil
和false
中只有两个值评估为 false,因此通常情况下,任何不正确的值都是nil。有时你会有布尔列,如果没有定义,可以是true
,false
或nil
,但这很不寻常,可能会使人绊倒。
答案 4 :(得分:0)
如果@listing.show_weekly
包含布尔值,则只测试true:
<% if @listing.show_weekly %>
.....
<% else %>
....
<% end %>
请注意,您甚至不需要“== true
”。这是因为IF语句只查看是否从其后面的任何表达式返回true
值。如果@listing.show_weekly
包含true
的值,则所有IF语句都会看到您是否提供了它。