Помните, что свойства вашей модели - это просто скрытые переменные экземпляра - все, что мы делаем, когда взаимодействуем с ними, - это вызываем методы getter и setter, установленные attr_accessor
.Когда мы пишем instance.bookshelf_color = "red"
, мы отправляем метод bookshelf_color=
с аргументом "red"
получателю instance
.
Круто.Что происходит, когда мы пишем просто bookshelf_color = "red"
?
В Ruby назначение голых слов используется для определения локальных переменных.Помещение name = "value"
в определение метода определит name
в локальной области, а не вызовет метод name=
для self
, даже если этот метод существует.
class Foo
attr_accessor :bar
def set_bar(val)
bar = val
end
end
f = Foo.new
f.set_bar "baz"
f.bar # still nil
Если бы я указалявный получатель, self.bar = val
, Руби знал бы, что я хотел бы отправить self
метод bar=
, который имел бы желаемый результат.
Есть еще несколько хороших подробностей о радостях self
и почему вы должны его использовать, в Блоге Джо Йейтса .