存储在boolean列中的值为false,由Rails评估为true?

时间:2011-07-04 14:20:55

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

在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视图和控制台查看数据库时,我分别看到了fu.subscriber => false。但是,当我使用logger.info "@user.subscriber = #{@user.subscriber.inspect}"查看视图帮助程序如何解释它时,我在日志中得到:@user.subscriber = true。所以,我假设问题在于我如何设置false,因为看起来rails似乎将订阅者列中的任何值解释为true(除了在控制台中,它似乎说它是假的?)。 / p>

3 个答案:

答案 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吗?功能好吗?

  • 在函数顶部添加: raise @ user.subscriber.inspect