Ruby on rails 如何初始化';属性存取器&x27;属性值?
可能重复:Ruby on rails 如何初始化';属性存取器&x27;属性值?,ruby-on-rails,ruby,ruby-on-rails-3,attributes,initialization,Ruby On Rails,Ruby,Ruby On Rails 3,Attributes,Initialization,可能重复: 我使用的是RubyonRails 3.0.9,我想在继承自ActiveRecord::Base的class\model中初始化一些attr\u访问器属性值。就是 。。。在我的模块中,我有: class User < ActiveRecord::Base attr_accessor :attribute_name1, :attribute_name2, :attribute_name3,
我使用的是RubyonRails 3.0.9,我想在继承自
ActiveRecord::Base
的class\model中初始化一些attr\u访问器
属性值。就是
。。。在我的模块中,我有:
class User < ActiveRecord::Base
attr_accessor :attribute_name1,
:attribute_name2,
:attribute_name3,
...
end
class用户
我想设置为true
allattr\u accessor
属性值我该怎么做?
附言:当然,我想通过“RubyonRails之路”来解决上述问题。我知道初始化后的回调,但通过使用该方法,我应该重复每个属性\u name
语句,我希望在初始化后的语句中将值设置为true
(…这不是干的-不要重复自己)。也许有更好的方法来实现这一点。当您声明属性时,是否有方法“动态”设置属性值?也就是说,我希望立即声明并设置attr\u访问器属性 您是否尝试过:
class User < ActiveRecord::Base
attr_accessor :attribute_name1,
:attribute_name2,
:attribute_name3,
...
after_initialize :set_attr
def set_attr
@attribute_name1 = true
...
end
end
class用户
残酷的解决方案
class User < ActiveRecord::Base
@@attr_accessible = [:attribute_name1, :attribute_name2, :attribute_name3]
attr_accessor *@@attr_accessible
after_initialize :set_them_all
def set_them_all
@@attr_accessible.each do |a|
instance_variable_set "@#{a}", true
end
end
end
class用户
或者更具概念性一点:我只需要定义一个惰性加载您感兴趣的值的getter,然后使用attr\u writer
来定义setter。比如说,
class Cat
attr_writer :amount_of_feet
def amount_of_feet; @amount_of_feet ||= 4; end # usually true
end
如果你是认真的,可以用一些元编程重写:
class Cat
# The below method could be defined in Module directly
def self.defaulted_attributes(attributes)
attributes.each do |attr, default|
attr_writer attr
define_method(attr) do
instance_variable_get("@#{attr}") ||
instance_variable_set("@#{attr}", default)
end
end
end
defaulted_attributes :amount_of_feet => 4
end
calin = Cat.new
print "calin had #{calin.amount_of_feet} feet... "
calin.amount_of_feet -= 1
puts "but I cut one of them, he now has #{calin.amount_of_feet}"
这是因为,通常情况下,计算默认值不会产生任何使订单变得重要的副作用,并且在您首次尝试访问该值之前,不需要计算该值
(C–lin是我的猫;他做得很好,仍然有四只脚)对于Rails 3.2或更早版本,您可以使用:
我更新了问题(阅读最后的“P.S.:”。@Backo,这里的所有东西都足够干了吗answer@apneadiving-当您声明“attr_accessor”属性值时,是否有方法“动态”设置这些属性值?@Backo:请进一步解释您的选择expect@apneadiving我希望立即声明并设置“attr_accessor”属性!名称(1,2…)背后有真正的逻辑吗?@apreading-当然有。请注意,当前读者从Rails 3.2开始就不赞成使用默认值的attr\u accessor\u
class User < ActiveRecord::Base
attr_accessor_with_default :attribute_name1, true
attr_accessor_with_default :attribute_name2, true
attr_accessor_with_default :attribute_name3, true
...
end
attr_accessor_with_default(:attribute_name) { FizzBuzz.new }