设备型号有以下属性:名称、版本和全名
全称是名称+版本:
class Device < ActiveRecord::Base
def prepare
full_name = (!show_version || version.nil?)? name : name + " " + version.to_s
end
end
当我执行以下操作时:
d = Device.new :name => "iPhone", :version => "4"
d.prepare
d.full_name # get nil
“全名”属性为零
当我使用“self”时,它起作用了:
class Device < ActiveRecord::Base
def prepare
self.full_name = (!show_version || version.nil?)? name : name + " " + version.to_s
end
end
做“准备”我得到“全名”属性的“iPhone 4”。
这里有人告诉我,避免在类方法中使用“self”是一种很好的方式。 但这带来了麻烦。
问题是 - 为什么不使用“self”就不能工作?
最佳答案
在这些情况下你必须使用 self,我不认为这是一个麻烦。如果您使用的是 self
,那么解释器将知道您指的是对象的属性。如果您不使用 self
,则意味着它只是一个局部变量,在方法完成后不会存储在任何地方。这是正常行为。您还可以使用 self[:full_name]= ...
作为 setter 方法,但在这种情况下并不重要。
更新
@AntonAL
因为 getter 方法在没有 self.
的情况下被识别。
当您尝试使用name
属性时,解释器将在当前方法中查找局部变量。如果没有找到,则查找实例属性。示例:
def your_method
self.name = 'iPhone'
puts name
#iPhone
name = 'iPod'
puts name
#iPod
puts self.name
#iPhone
end
iPhone
将存储在对象实例的 name
属性中。而 iPod
会在该方法结束后丢失。
关于ruby-on-rails - 在不使用自身的情况下从模型设置属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5369381/