簡體   English   中英

attr_accessor 默認值

[英]attr_accessor default values

我正在使用 rails,我希望將attr_accessor:politics默認設置為 false。

有誰知道如何做到這一點並且能夠為我簡單地解釋它?

Rails 有attr_accessor_with_default所以你可以寫

class Like
  attr_accessor_with_default :politics,false
end

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

就這樣

更新

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

如果您定義attr_accessor ,則默認值為nil 你可以寫它,從而使它成為!nil

您可以使用 virtus gem:

https://github.com/solnic/virtus

從自述文件:

Virtus 允許您在類、模塊或 class 實例上定義屬性,並提供有關類型、讀取器/寫入器方法可見性和強制行為的可選信息。 它支持嵌入對象和 collections 的大量強制和高級映射。

它特別支持默認值

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

在我看來,我認為這個答案很好。 雖然我們重寫了initialize()方法,但由於在該方法的第一行調用了 super,它並沒有改變基本的 class initialize()方法,而是 Object 的一個關鍵特性覆蓋它,並在初始化對象時添加更多功能。 在從數據庫讀取對象時也不會跳過初始化程序,因為在 function 的第一行調用了super

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

class Song < ActiveRecord::Base

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

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

所以..你可以執行遷移

(1) rails g migration ChangePoliticsColumnToDefaultValueFalse

(2) 在def self.up中添加這個

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

底線是在遷移中設置了默認屬性。

希望這可以幫助!

編輯:

還有一些類似的問題也得到了很好的回答:

喜歡這里這里

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

class Contact < ActiveRecord::Base
attr_accessor :virtual_variable
end

並以如下形式使用:-

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

您可以在 controller 參數中找到這些虛擬變量值...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM