我有一个分类和一个帖子模型,每个帖子属于一个类别。在创建或更新帖子之前,我需要检查所选的类别是否存在。验证此信息的最佳方法是什么?
目前,我正在控制器中进行查找,以确保该类别存在。是否可以在模型中加入这些验证?
答案 0 :(得分:20)
在Rails 3.2中,validates_existence_of被validates_presence_of替换。
答案 1 :(得分:16)
http://blog.hasmanythrough.com/2007/7/14/validate-your-existence
class Post < ActiveRecord::Base
belongs_to :category
validates_presence_of :category
end
-OR -
class Post < ActiveRecord::Base
belongs_to :category
validates :category, presence: => true
end
3.2之前的Rails版本:
class Post < ActiveRecord::Base
belongs_to :category
validates_existence_of :category
end
答案 2 :(得分:5)
我把它放在我的模型中:
validate :ensure_category_exists
def ensure_category_exists
errors.add('Category') unless self.blog.categories.find_by_id(self.category_id)
end
如果父博客不存在类别,则打印“类别无效”。
答案 3 :(得分:1)
以我的思维方式,这个宝石有更好的选择:https://github.com/perfectline/validates_existence
验证相关模型在数据库中的存在。想象一下,即使您没有选择任何内容(默认未选择第一个字段标签作为值),您也有一个下拉字段可以返回一些垃圾数据。验证状态将不起作用,因为它将传递现有数据。但我们想要某种约束,这种数据库边检查可以解决问题。
答案 4 :(得分:0)
我的经历绝对值得一提。这适用于Rails 4(也可能是其他版本)。
给出实体模型的has_many或has_one。
即使提交中提供了ID,也可以确保输入的关联(关联ID)存在的验证。
validates_presence_of :model
这不是验证,它可以确保输入中输入了某些内容(不是空白)。
validates_presence_of :model_id
您也许可以只使用前者,但我俩都必须有更具体的错误消息。
答案 5 :(得分:-2)
在Rails 3中,validates_associated
可能是您正在寻找的?
http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated