验证失败,字段必须与allow_nil一起存在

时间:2015-12-26 19:39:00

标签: ruby-on-rails validation

我正在创建一个博客,其中的文章可以回复其他文章。文章也可以是群体的一部分。但是,文章不必属于一个组或是对另一篇文章的回应。

我正在尝试按照Rails文档创建文章self-joined records

我创建了用户,组和文章支架:

bin/rails g scaffold user username:string email:string birthday:date

bin/rails g scaffold group name:string user:references

bin/rails g scaffold article user:references parent:references title:string subheading:string body:text pub_date:datetime group:references hidden:boolean prompt:boolean

我正在尝试在模型验证中使用allow_nil

class Article < ApplicationRecord
  belongs_to :user
  belongs_to :parent, class_name: "Article"
  has_many :replies, class_name: "Article", foreign_key: "parent_id"
  belongs_to :group

  validates :parent, length: {minimum: 1}, allow_nil: true
  validates :group, length: {minimum: 1}, allow_nil: true
end

然而,当我运行db:seed:

user1 = User.create(username: "pete01",email: "pete01@gmail.com",
    birthday:"1980-01-30")

article1 = Article.create!(user:user1, parent:nil, title:"My First Article",
        subheading:"This is important", body:"The body of my first article",
        pub_date:"2015-12-26", group:nil, hidden:false, prompt:false)

我收到此错误:

ActiveRecord::RecordInvalid: Validation failed: Parent must exist, Group must exist

在其他地方我应该告诉Rails它不需要验证Group和Parent吗?

5 个答案:

答案 0 :(得分:6)

解决方案是找到文件new_framework_defaults.rb,将其更改为false

Rails.application.config.active_record.belongs_to_required_by_default = false

答案 1 :(得分:3)

#app/models/article.rb
class Article < ActiveRecord::Base
   belongs_to :parent, class_name: "Article"
   belongs_to :group

   validates :parent, presence: true, allow_nil: true
   validates :group, presence: true, allow_nil: true
end

有几个问题:

您正在验证parent&amp; group - 这些是关联的对象

您的错误显示为"[Object] must exist",这表示您的验证正常工作 - Rails无法找到&#34; nil&#34;协会(它期待的对象)。

parent_id,或使用类似group_id的内容验证关联对象的存在。

我已经包含了以下我将使用的验证:

presence

您也可以尝试:

validates :parent, presence: true, allow_nil: true
validates :group, presence: true, allow_nil: true
  

文章也可以是群体的一部分

您可能希望使用has_and_belongs_to_many关联,然后:

validates :parent_id, length: { minimum: 1 }, allow_nil: true
validates :group_id, length: { minimum: 1 }, allow_nil: true

您需要一个名为#app/models/article.rb class Article < ActiveRecord::Base has_and_belongs_to_many :groups end #app/models/group.rb class Group < ActiveRecord::Base has_and_belongs_to_many :articles end 的联接表,其中列为articles_groups&amp; article_id

enter image description here

您可以按如下方式创建迁移:

group_id

这将允许您填充关联对象,如下所示:

$ rails g migration CreateArticlesGroups

# db/migrate/create_articles_groups__________.rb
class CreateArticlesGroups < ActiveRecord::Migration
  def change
    create_table :articles_groups, id: false do |t|
      t.belongs_to :article, index: true
      t.belongs_to :group, index: true
    end
  end
end

$ rake db:migrate

答案 2 :(得分:1)

allow_nil: true是验证程序的选项,而不是validates方法的选项。您正在使用length:密钥,该密钥将LengthValidator调用{minimum: 1}哈希作为参数(类似于使用validates_length_of)。

例如,使用

validates :parent, length: {minimum: 1, allow_nil: true}

而不是

validates :parent, length: {minimum: 1}, allow_nil: true

注意:如果使用多个验证器,则需要为每个验证器指定allow_nil

答案 3 :(得分:1)

这很可能是迁移到Rails 5的结果,其中belongs_to关系的默认值发生了变化。有关详细信息,请参阅this answer

答案 4 :(得分:0)

尝试删除您的验证。另请检查Article的迁移情况。也许您null: falsegroup_id

parent_id
class Article < ApplicationRecord
  belongs_to :user
  belongs_to :parent, class_name: "Article"
  has_many :replies, class_name: "Article", foreign_key: "parent_id"
  belongs_to :group
end