Rails, как установить временную переменную, а не поле базы данных

Для моего приложения у меня разные точки входа для входа, которые проверяют вещи по-разному.

Таким образом, в главной регистрации ничего не требуется, кроме поля для отправки и отправки по электронной почте. В альтернативном поле регистрации требуется еще много. Поэтому в модели пользователя у меня есть

validate_presence_of :blah, :lah, :foo, :bah, :if => :flag_detected

def flag_detected
  !self.flag.nil?
end

Я хочу установить этот флаг через контроллер. Однако этот флаг не является полем базы данных. Мне просто интересно, возможно ли это в Rails или что-то не так с тем, как я думаю об этом? Если да, то какой лучший способ достичь этого? Спасибо.

Ответы

Ответ 1

Вам нужно attr_accessor

class User < ActiveRecord::Base
  attr_accessor :flag
  attr_accessible :flag # if you have used attr_accessible or attr_protected else where and you are going to set this field during mass-assignment. If you are going to do user.flag = true in your controller action, then no need this line
end

в основном attr_accessor :flag создайте методы user.flag и user.flag = ... для вашей модели.

и attr_accessible предназначены для защиты от массового присвоения.

Ответ 2

Следуя обсуждению лучшей практики:

Создайте метод, который делает то, что вы хотите. То есть save_with_additional_validation. Это гораздо более понятный и самодокументирующий код и работает одинаково. Просто вызовите этот метод вместо save()

Ответ 3

Кажется, вам нужно определить метод setter

 class User < ActiveRecord::Base
   attr_accessible :flag

   def flag=(boolean)
     boolean
   end
 end