Ruby on rails 存储在布尔列中为false的值是否由Rails计算为true?

Ruby on rails 存储在布尔列中为false的值是否由Rails计算为true?,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,我很难在Rails中得到一个简单的真/假来正确评估。我有一个助手: def should_we_ask_to_subscribe? if @user.email.blank? true elsif @user.subscriber == false true else false end end 我测试为blank,因为用户对象是由omniauth创建的,有时,就像Twitter一样,我没有收到电子邮件。创建授权后,将指

我很难在Rails中得到一个简单的真/假来正确评估。我有一个助手:

 def should_we_ask_to_subscribe?
    if @user.email.blank?
      true
    elsif @user.subscriber == false
      true
    else
      false
    end
  end
我测试为blank,因为用户对象是由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 %>
这是代码,在我的模型中的一个方法中,它实现了:

self.update_attribute(:subscriber, false)   

当我通过SQLite视图和控制台查看数据库时,我分别看到
f
u.subscriber=>false
。但是,当我使用
logger.info“@user.subscriber=#{@user.subscriber.inspect}”
查看视图帮助程序如何解释它时,我在日志中得到:
@user.subscriber=true
。因此,我假设问题在于如何设置
false
,因为rails似乎正在将订户列中的任何值解释为true(控制台中的值除外,控制台中的值似乎是false?)。

我很想知道订户字段信息是如何保存在数据库中的

您是否可以在您的网站内提高@user.subscriber?我们是否应该要求您订阅?功能好吗

  • 在函数顶部添加以下内容: raise@user.subscriber.inspect

这是一个很好的单元测试候选者,它将测试您的模型并确定是否实现了正确的行为。例如:

@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

诊断订阅服务器的值是否不是
nil
(这是一个错误的等效值)或它是否不是任何其他值

将这一行放入“我们是否应该请求订阅”功能中:

logger.info "@user.subscriber = #{@user.subscriber.inspect}"

您的
subscriber
属性是否声明为布尔值?该复选框将发送一个值“0”(一个字符串),在ruby中该值将计算为true,但通常会神奇地转换为“false”,但仅适用于布尔属性。

RuntimeError in Users#edit Showing/Users/justin/Code/Publication/app/views/Users/_form.html.erb,其中第21行显示:trueI正在开发中使用SQLite。Postresql计划用于生产。这很有趣。日志显示
@user.subscriber=true
,即使在控制台中我得到该特定用户的
subscriber:false
。这可能意味着该属性在控制器中已更改,但未保存到数据库中。仔细检查日志,查看是否有SQL命令“插入”或“更新”的迹象。按照Tadman的建议,编写一个单元测试,然后您可能希望编写一个功能测试,它将显示控制器的错误行为(如果这是控制器的问题)。完成测试后,尝试在代码中查找错误。可能对象无效,但不知何故没有显示错误?另外,“false”值是真正的ruby布尔值,还是一个包含内容的字符串,其内容为
“false”
?嗯,我只是想问一下。请不要生气好的,我已经更新了这篇文章,回答了你的想法。我不认为这是一个字符串,但我在我的结束,看看什么是错的。
logger.info "@user.subscriber = #{@user.subscriber.inspect}"