Виртуальный атрибут игнорируется

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня какая-то странная проблема с виртуальными атрибутами в rails.

Вот мой пример модели.

 class User < ActiveRecord::Base
  validates_presence_of :last_name
  validates_presence_of :first_name

  def clean!
    first_name = nil
    last_name = nil
  end
end
  

Затем я могу сделать:

 user = User.first
user.last_name # => "Smith"
user.clean!
user.save # => true
user.first_name # => "Smith"
  

Прямо сейчас first_name = nil часть игнорируется.
Кто-нибудь знает почему?

Комментарии:

1. что, если вы введете: user.reload перед user.first_name ?

2. почему вы называете это виртуальным атрибутом? Похоже, что это не так.

3. Я думаю, что у вас также есть опечатка в вашем вопросе, вы указываете last_name, а затем спрашиваете о first_name … подробности подробнее … 😉

4. @apneadiving Я удалил большую часть исходного кода. Мой первый пример содержал некоторые виртуальные атрибуты, но был немного сложным для этого поста.

Ответ №1:

Это не виртуальный атрибут, это просто метод. Это не работает, потому что оно не знает, что first_name — это метод внутри функции, и думает, что это переменная. использовать:

 def clean!
  self.first_name = nil
  self.last_name = nil
end
  

Виртуальный атрибут OTOH подобен новому столбцу таблицы, который может быть назначен:

полное имя определения
 [first_name, last_name].join(' ') 
завершение

полное имя определения=(name)
 split = name.split(' ', 2) 
 self.first_name = split.first 
 self.last_name = split.last 
завершение

( код виртуального атрибута взят из http://railscasts.com/episodes/16-virtual-attributes )