ruby-on-rails - 在不使用自身的情况下从模型设置属性不起作用

标签 ruby-on-rails ruby naming-conventions self

设备型号有以下属性:名称、版本和全名

全称是名称+版本:

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/

相关文章:

ruby-on-rails - ActiveAdmin 和就地编辑

ruby - 接受字典键并返回一个填充有适当键值的数组

PHP 父类、抽象类和接口(interface)文件名约定

ruby-on-rails - Rails 未定义方法 `map' for nil :NilClass - form collection_select

javascript - Rails & JS : Make panels generated by . 每个功能独立切换

ruby - 使用 Watir 时为 "NameError: uninitialized constant UserAgent"

ruby - 翻转 ruby​​ 哈希关联的内置方法

javascript - 关于记录 JavaScript : JS types 的问题

naming-conventions - 我应该如何命名这个集合类?

ruby-on-rails - Rails 服务器错误,在 requests.accepts : "[\"\\xE2\\x80\\x8B/\\xE2\\x80\\x8B\"]" 中有奇怪的符号