Вызов методов доступа изнутри объекта Model в Rails - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть следующий метод в моей модели

def reset_review_status
   needs_review = true
   save
end

В модели есть атрибут needs_review, однако, когда я отлаживаю его, он сохраняет его как новую переменную.Если я делаю self.needs_review=true, это работает нормально.У меня нет условия attr_accessible, хотя у меня есть один accepts_nested_attributes_for.

Есть мысли о том, почему это может происходить?

1 Ответ

4 голосов
/ 11 февраля 2011

Когда вы определяете атрибут в ActiveRecord, доступны следующие методы

# gets the value for needs_review
def needs_review
end

# sets the value for needs_review
def needs_review=(value)
end

Вы можете вызвать сеттер, используя

needs_review = "hello"

но это так же, как вы устанавливаете переменную. Когда вы вызываете оператор внутри метода, Ruby отдает более высокий приоритет присваиванию переменных, поэтому будет создана переменная с таким именем.

def one
# variable needs_review created with value foo
needs_review = "foo"
needs_review
end

one
# => returns the value of the variable

def two
needs_review
end

two
# => returns the value of the method needs_review
# because no variable needs_review exists in the context
# of the method

Как правило:

  1. всегда используйте self.method_name =, когда вы хотите вызвать сеттер в методе
  2. при необходимости используйте self.method_name, когда в контексте существует локальная переменная с тем же именем
...