虚拟属性验证 Rails 3

Posted

技术标签:

【中文标题】虚拟属性验证 Rails 3【英文标题】:Virtual attribute validation Rails 3 【发布时间】:2012-03-29 12:00:22 【问题描述】:

我还没有对这个 Jquery-tokeninput 或 Rails 虚拟属性做很多事情,但我一直用这个把头撞到墙上。感谢您提供任何帮助或指导。

我的公告模型中有一个虚拟属性读取器,我需要验证是否存在:

attr_reader :clas-s-room_tokens
validates :clas-s-room_tokens, :presence => true``

接着是getter和setter:

def clas-s-room_tokens=(ids)
    self.clas-s-room_tokens = ids.split(",")
end

def clas-s-room_tokens
    #Tried several things here
end 

我真的只需要确保 params[:announcement][:clas-s-room_tokens] 不为空。上面的 validate 调用似乎在看别的东西,因为无论如何它总是空的。我错过了什么?非常感谢任何帮助。

导轨 3.1 红宝石 1.9.2

更新: 如果我这样做了

#Announcement MODEL
attr_reader :clas-s-room_tokens
#validates :clas-s-room_tokens, :presence => true
def clas-s-room_tokens=(ids)
  @clas-s-room_tokens = ids.split(",")
end

#Announcement_controller create action
puts "Token=>#@announcement.clas-s-room_tokens|"
puts "Params=>#params[:announcement][:clas-s-room_tokens]|" 

我明白了:

Token=>|
Params=>7,13,12|

【问题讨论】:

验证发生在模型上。模型不应该对用于构建它们的参数一无所知。 class_tokens 要么存在,要么不存在。尝试在 ActiveRecord 对象上添加自己的 setter/getter 方法会使事情复杂化,因为 ActiveRecord 正在尝试为您执行此操作。如果您需要从 comma_delineated 数组中设置教室标记,请为此使用不同的方法。如果您需要特殊的 getter,请将其命名为属性名称以外的其他名称。 感谢您的回复。由于classic_tokens 是一个虚拟属性,我在那里添加了setter 只是为了帮助完成comma_delineated 分配,并且一直觉得我在搞乱getter。二传手工作得很好。我所做的也是完全阅读 getter 和 setter,但仍然遇到同样的问题,它认为它总是空的。 【参考方案1】:

不用设置self.clas-s-room_tokens,只需设置实例变量@clas-s-room_tokens,然后删除clas-s-room_tokens 方法,因为您使用attr_reader 隐式定义它。代码应如下所示:

attr_reader :clas-s-room_tokens
validates :clas-s-room_tokens, :presence => true``

def clas-s-room_tokens=(ids)
    @clas-s-room_tokens = ids.split(",")
end

【讨论】:

啊...我不知道我 attr_reader 会隐含地定义它,但回想起来它是有道理的。另一方面,它给了我相同的结果“空白”错误。快速查看参数告诉我它在那里但它不会保存它。我没有任何其他模型代码处理此属性。 "announcement"=>"clas-s-room_tokens"=>"13", "subject"=>"no subject", "message"=>"adsfadsfasdf", "location"=>"adsfasdf", "date"=>"27 -03-2012", "allow_email"=>"0", "allow_call"=>"0", "allow_sms"=>"0" update_attributes 在我打电话给user.update_attributes(:clas-s-room_tokens => "foo,bar") 时为我工作,所以我怀疑问题可能在于你如何称呼它?你打电话给user.update_attributes(params["announcement"])?还要确保你在attr_accessible中有clas-s-room_tokens 嗨,本,感谢您的回复。正如上面的更新以某种方式展示的那样,由于参数存在而不是虚拟属性,因此没有设置属性。上面关于虚拟属性的假设是否有意义? 完成!你成功了!我忘了把它添加到 attr_accesible。我有点尴尬。非常感谢。 @Yuri 你能说明你如何/在哪里调用 update_attributes 吗?

以上是关于虚拟属性验证 Rails 3的主要内容,如果未能解决你的问题,请参考以下文章

rails 3验证多个属性的唯一性

rails 3 的验证自定义消息

Rails - 验证:如果一个条件为真

rails 3中的api身份验证

Rails 3:验证组合值

rails 3 使用设备进行身份验证