Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何初始化';属性存取器&x27;属性值?_Ruby On Rails_Ruby_Ruby On Rails 3_Attributes_Initialization - Fatal编程技术网

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
all
attr\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 }