назначение атрибута в обратном вызове не работает? - PullRequest
2 голосов
/ 31 марта 2012

У меня есть модели HABTM Client и Book.Client модель имеет атрибут bookshelf_color, указывающий, есть ли у клиента полный набор книг, часть их или нет.Как только книги на книжной полке меняются, обратный вызов set_bookshelf_color должен отражать это изменение.

Вопрос в том, почему я должен добавить префикс bookhelf_color в закрытом обратном вызове ниже к "self.", чтобы заставить его работать (как это не иначе)?

1 Ответ

1 голос
/ 31 марта 2012

Помните, что свойства вашей модели - это просто скрытые переменные экземпляра - все, что мы делаем, когда взаимодействуем с ними, - это вызываем методы 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 и почему вы должны его использовать, в Блоге Джо Йейтса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...