在Rails中使用简单的true / false进行正确评估时遇到了很多麻烦。我有一个帮手:
def should_we_ask_to_subscribe?
if @user.email.blank?
true
elsif @user.subscriber == false
true
else
false
end
end
我测试为空白,因为用户对象是由omniauth创建的,有时候,与Twitter一样,我没有收到电子邮件。创建授权后,将指示用户更新其配置文件并添加电子邮件。如果没有电子邮件,我确保提供订阅选项,因为他们无法订阅。这是观点:
<% if should_we_ask_to_subscribe? %>
<div class="field">
<%= f.check_box :subscriber %>
<%= f.label :subscriber, "It's okay to send me the occassional email. I know I can unsubscribe at any time." %>
</div>
<% else %>
<div class="field">
You're subscribed to our email list.<br />
<%= f.check_box :unsubscribe %>
<%= f.label :unsubscribe, "Please unsubscribe me." %>
</div>
<% end %>
然而,即使订阅布尔值设置为f
- 说用户已输入电子邮件但未订阅(或取消订阅,这是布尔值f
的唯一方式) should_we_ask_to_subscribe?
仍然评估为false。我尝试了各种各样的方法,但我只是没有得到它。
好的,很明显数据库将布尔值存储为false,但是rails将其解释为true,我无法理解为什么。按照下面的检查建议,日志显示@ user.subscriber = true,即使在控制台和数据库中我得到订户:false为该特定用户。
所以我写了一些单元测试,他们都通过了。在我的日志中,我注意到代码正在执行以下操作:
(0.4ms) UPDATE "users" SET "subscriber" = 'f', "updated_at" = '2011-07-05 13:40:58.178186' WHERE "users"."id" = 47
这是代码,在我的模型的方法中,这样做:
self.update_attribute(:subscriber, false)
当我通过SQLite视图和控制台查看数据库时,我分别看到了f
和u.subscriber => false
。但是,当我使用logger.info "@user.subscriber = #{@user.subscriber.inspect}"
查看视图帮助程序如何解释它时,我在日志中得到:@user.subscriber = true
。所以,我假设问题在于我如何设置false
,因为看起来rails似乎将订阅者列中的任何值解释为true(除了在控制台中,它似乎说它是假的?)。 / p>
答案 0 :(得分:2)
这是单元测试的一个很好的候选者,它将运用您的模型并确定是否实现了正确的行为。例如:
@user = User.create(...)
assert @user.email.blank?
assert !@user.subscriber?
assert_equal true, @user.should_we_ask_to_subscribe?
@user.email = 'test@example.email'
assert_equal false, @user.should_we_ask_to_subscribe?
@user.unsubscribe = true
assert_equal true, @user.should_we_ask_to_subscribe?
作为一个注释,如果您处理解释的变量为true或false的变量,则不需要如此正式地将值与false进行比较。一个简单的重构看起来像这样:
def should_we_ask_to_subscribe?
# Show subscription option if no email has been provided.
return true if @user.email.blank?
# Otherwise ask to subscribe if not a subscriber
!@user.subscriber?
end
答案 1 :(得分:1)
诊断订阅者的值是否不是nil
(这是错误的等价物)还是不是任何其他值。
将此行放在should_we_ask_to_subscribe
函数中:
logger.info "@user.subscriber = #{@user.subscriber.inspect}"
您的subscriber
属性是否声明为布尔值?该复选框将发送一个值“0”(一个字符串),它将在ruby中评估为true,但通常被神奇地转换为'false',但仅用于布尔属性。
答案 2 :(得分:0)
我很清楚看到订户字段信息以何种方式保存在您的数据库中。
你能在你的should_we_ask_to_subscribe中提升@ user.subscriber吗?功能好吗?