2012-11-30 69 views
0

我有以下的(簡化)模型和遷移:Rails無法識別將變量設置爲'false'?

型號:

class User < ActiveRecord::Base 
    attr_readonly :contacted 

    validates :contacted, :inclusion => { :in => [true, false] } 

    def set_contacted 
    self.contacted = true 
    end 

    def unset_contacted 
    # self.contacted = false 
    self.contacted = "0" 
    end 
end 

遷移:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.boolean :contacted,  :null => false, :default => false 

     t.timestamps 
    end 
    end 
end 

正如你可以在我的模型註釋那種看到,設置變量contact到錯誤的結果 - 我只能將它設置爲「0」。爲什麼?我不明白「假」是如何違反null約束的,對吧?

編輯: 澄清,我使用PostgreSQL和ActiveRecord。那我得到的錯誤是這樣的:

C:/Ruby193/lib/ruby/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in 'save!' Validation failed: ActiveRecord::RecordInvalid) 

我得到的錯誤,即使我刪除從我的模式「驗證」的聲明,即使我刪除從遷移NULL約束。這與將屬性的值設置爲false有關。 ActiveRecord布爾值有一些奇怪的約束嗎?

+0

您使用的是哪種數據庫系統?另外,請將錯誤消息添加到您的問題。 – 2012-11-30 08:40:17

+0

我正在使用Postgresql。我收到了一連串的消息,主要是說ActiveRecord「保存!」失敗。 – Bryce

+1

即使你不認爲它會有所幫助,將錯誤信息粘貼到問題中總是一個好主意。 – 2012-11-30 09:37:09

回答

0

似乎沒有人能解決這個問題,但它不再是我的問題。我的模型更適合使用state_machine gem,所以我完全刪除了這個字段。

1

如果沒有具體的錯誤信息,回答你的問題有點困難。

首先我會將attr_readonly更改爲attr_accessible - 所以該字段可以更新。

其次,我想重新寫你的方法:

def unset_contacted 
    self.contacted = false 
    self.save! # Saving your methods (the ! is for throwing an exception if it fails). 
    end 
+0

我試圖改變這種情況,並且仍然出現錯誤。 – Bryce