2011-07-16 130 views
42

我正在使用rails,並且我想讓它的默認值爲attr_accessor :politics爲false。attr_accessor默認值

有誰知道如何做到這一點,並能夠用簡單的詞語來解釋它嗎?

回答

101

Rails已經attr_accessor_with_default所以你可以寫

class Like 
    attr_accessor_with_default :politics,false 
end 

i = Like.new 
i.politics #=> false 

和多數民衆全部

UPDATE

attr_accessor_with_default已經對Rails 3.2被棄用..你可以用純Ruby

class Like 
    attr_writer :politics 

    def politics 
    @politics || false 
    end 
end 

i = Like.new 
i.politics #=> false 
+13

請注意,該示例僅適用於默認值false。我需要一個默認的true,所以我用:'@ politics.nil? ? true:@ politics' – micapam

+3

如果您默認數組,請使用:'def politics; @politics || = [];除非您以其他方式爲政治賦值,否則「結尾」或「將不起作用。 –

+0

我認爲Dave Newton建議的'after_initialize'方法是最好的解決方案 – josal

-1

這不是在attr_accessor中完成的,而是在您的遷移中完成的。

所以..你可以執行遷移

(1)rails g migration ChangePoliticsColumnToDefaultValueFalse

(2)添加這def self.up

def self.up change_column :your_table, :politics, :boolean, :default => 0 end

的底線是,默認的屬性設置中遷移。

希望這會有所幫助!

編輯:

有一些類似的問題也已經回答得很好:

herehere

+4

實際上'attr_accessor'是正確的方法,如果你不希望你的屬性存儲在數據庫中。 –

0

如果你定義attr_accessor,在默認情況下做到這一點,而不是值nil。你可以寫,從而!nil

-2

我一直在使用這種形式的ActiveRecord:

class Song < ActiveRecord::Base 

    def initialize(*args) 
     super(*args) 
     return unless self.new_record? 
     self.play_count ||= 0 
    end 
end 
+2

你不應該在ActiveRecord對象中重載初始化,而應該使用before_create。 – tesserakt

+0

爲什麼不呢?初始化程序僅在從數據庫讀取對象時跳過。對於默認值,您不希望它覆蓋來自db的信息。 – mcmoyer

+0

@ user1144360因爲[Rails AR指導性說明](http://guides.rubyonrails.org/active_record_validations_callbacks.html#after_initialize-and-after_find)有一個專門提供的'after_initialize',以避免需要重寫'initialize'。海事組織從長遠來看這樣做更安全。問題在於AR可能會從你下面改變並改變行爲。 –

0
class Song < ActiveRecord::Base 
    def initialize(*args) 
    super(*args) 
     return unless self.new_record? 
     self.play_count ||= 0 
    end 
end 

在我看來,我覺得這個答案是不錯的。儘管我們重寫了初始化方法,但是因爲在此方法的第一行調用了super,所以它沒有改變任何基類初始化方法,而這是面向對象編程的關鍵特性,我們可以覆蓋它,並添加一些在對象初始化的時候有更多的功能。此外,從數據庫讀取對象時,初始化程序不會被跳過,因爲超級函數在函數的第一行被調用。

+4

IMO'after_initialize'比覆蓋重寫框架的方法更好,並且[Rails AR指南鼓勵使用](http://guides.rubyonrails.org/active_record_validations_callbacks.html#after_initialize-and-after_find)。問題是AR可能會從你下面改變並改變行爲。 –

+0

感謝戴夫por你的建議,我認爲是最好的! – josal

-3

attr_accessor在rails中只是虛擬變量,它不存儲在數據庫中,只能在活動記錄不在應用程序中保存或更新之前使用。 可以在模型中定義attr_accessor像

class Contact < ActiveRecord::Base 
attr_accessor :virtual_variable 
end 

和類似形式使用: -

<div class="field"> 
    <%= f.label :virtual %><br> 
    <%= f.text_field :virtual %> 
    </div> 

,你可以發現,在控制器PARAM這些vartual變量值...

0

你可以使用美德寶石:

https://github.com/solnic/virtus

自述文件:

Virtus允許您使用關於類型,讀寫器方法可見性和強制行爲的可選信息來定義類,模塊或類實例的屬性。它支持很多強制和嵌入對象和集合的高級映射。

它特別支持default values