【发布时间】:2011-07-04 14:20:55
【问题描述】:
我很难在 Rails 中正确评估一个简单的真/假。我在助手中有这个:
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,但 rails 将其解释为 true,我真的不明白为什么。按照下面的检查建议,日志显示 @user.subscriber = true 即使在控制台和数据库中我得到subscriber: 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(除了在控制台中,它似乎在说它是 false?)。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1