#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 )