Rails如何设置一个不是数据库字段的临时变量

时间:2012-03-14 06:37:32

标签: ruby-on-rails activerecord

对于我的应用,我有不同的注册入口点,以不同的方式验证事物。

因此,在主要注册中,除电子邮件和密码字段外,不需要任何操作。在另一个注册领域,还需要更多。所以在用户模型中我有

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

def flag_detected
  !self.flag.nil?
end

我想通过控制器设置该标志。但是,该标志不是数据库字段。我只是想知道这是否可以在Rails中实现,或者我在想这个问题的方式有什么问题?如果是这样,实现这一目标的最佳方法是什么?感谢。

3 个答案:

答案 0 :(得分:28)

您需要的是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's action, then no need this line
end

基本上attr_accessor :flag为您的模型创建user.flaguser.flag = ...方法。

attr_accessible用于质量分配保护。

答案 1 :(得分:3)

跟进最佳实践辩论:

创建一个能够满足您需求的方法。即save_with_additional_validation。这是更加清晰和自我记录的代码,并以相同的方式工作。只需调用此方法而不是save()

答案 2 :(得分:1)

好像你需要定义setter方法

 class User < ActiveRecord::Base
   attr_accessible :flag

   def flag=(boolean)
     boolean
   end
 end