Ruby on rails 使用mixin初始化类变量

Ruby on rails 使用mixin初始化类变量,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有 我要这样 module Skin def initialize self.skin = "fuzzy" end end >Fruit.new # 尝试定义皮肤的读写器: >> Fruit.new #<Fruit skin: "fuzzy", created_at: nil, updated_at: nil> 编辑:对于rails,您可能会删除attr\u writer行,并将@skin更改为self.skin或self[:skin

我有

我要这样

module Skin
    def initialize
        self.skin = "fuzzy"
    end
end
>Fruit.new
#

尝试定义皮肤的读写器:

>> Fruit.new
#<Fruit skin: "fuzzy", created_at: nil, updated_at: nil>

编辑:对于rails,您可能会删除
attr\u writer
行,并将
@skin
更改为
self.skin
self[:skin]
,但我还没有测试过。它确实假设您将首先访问skin来设置它,但是您可以通过将它与数据库中的默认值耦合来解决这个问题。可能有一个特定于rails的回调可以提供更简单的解决方案。

在初始化回调后使用
ActiveRecord

module Skin
  def skin
    @skin||="fuzzy"
  end
  attr_writer :skin
end

class Fruit
  include Skin
end

f=Fruit.new
puts f.skin # => fuzzy
f.skin="smooth"
puts f.skin # => smooth
模块皮肤
def自带(基本)
base.after_initialize:skin_init
结束
def皮肤试验
self.skin=。。。
结束
结束
类水果
我想在进行任何调整之前,您只需致电super即可:

module Skin
  def self.included(base)
     base.after_initialize :skin_init
  end

  def skin_init
    self.skin = ...
  end
end

class Fruit < AR::Base
  include Skin
  ...
end
模块皮肤
def初始化(*)
超级的
self.skin=“fuzzy”
结束
结束
class

未经测试。

似乎对我不起作用。水果是否在名称空间中有关系?i、 e.
食品::水果
@Axsuul-请参见我的编辑。初始化后的
回调对于Rails 3的工作方式有点不同。代码现在更新了。试试看。谢谢,这很有效。对不起,忘了提到我在Rails 3上。啊,Rails需要这么多黑客=/Bonus问题:如果我使用水果.create(:skin=>“smooth”),它确实可以
。如何使
create
覆盖mixin的值?将模块中的代码更改为
self.skin | |=“fuzzy”
。这应该可以做到:)您不应该覆盖
ActiveRecord
对象上的
initialize
。Rails不保证在所有情况下都调用
initialize
。看这里:很有趣,谢谢。我个人并不使用ActiveRecord,但这一点值得注意:)
module Skin
  def self.included(base)
     base.after_initialize :skin_init
  end

  def skin_init
    self.skin = ...
  end
end

class Fruit < AR::Base
  include Skin
  ...
end
module Skin
  def initialize(*)
    super
    self.skin = "fuzzy"
  end
end

class Fruit < ActiveRecord::Base
  include Skin
end