通过属性验证has_many的存在

时间:2014-07-07 15:11:53

标签: ruby-on-rails validation

我目前正在创建一个文档管理系统,将文档及其可能的许多版本分类。

我现在的问题是使用'validates'来验证类别的存在。当我在文档中使用属性允许单个类别时,此方法很好,但现在我允许多个,使用:through =>的归类。

我创建新文档的表单要求用户填写要求“标题”,“内容”和“类别”的表单。标题和内容都是文档的属性,而类别不是,因为它是从使用has_many:categories,:through =>中提取的。分类

我的文档模型

has_many :categorisations
has_many :categories, :through => :categorisations
validates :title, presence: true, uniqueness: true, length: {minimum: 5, maximum: 25}
validates :content, presence: true

我的分类模型

has_many :categorisations
has_many :documents, :through => :categorisations

我的分类模型

belongs_to :document
belongs_to :category

我创建分类的表单部分如下所示:

      - Category.all.in_groups_of(3,false) do |row_category_names|
    %tr
      - for categories in row_category_names
        %td
          = check_box_tag "categorisation[category_ids][]", categories.id
          %label= categories.title

create方法的一部分,用于创建与文档匹配的Categorisations:

  for category in params[:categorisation][:category_ids]
    Categorisation.create(:document_id => @document.id, :category_id => category)
  end

Doc Versions'show'看起来如下:

    - @doc_version.document.categories.each_with_index do |category, index|
      - if index == @doc_version.document.categories.size - 1
        = category.title
      - else
        = category.title + ", "

当选择至少一个类别时,一切都按预期工作。

我尝试将'validates'和'validates_presence_of'的所有变体用于:category,:categories,:categorisations,:category_id等等,果然,如果没有选择类别,它们会阻止提交表单,但是,如果选择了某个类别,它们也会阻止提交表单。因此,它没有按预期工作。

由于表单不允许选择任何类别,并且仍然在不提取验证错误的情况下进入下一阶段,因此我在“创建”方法中出现此错误:

undefined method `[]' for nil:NilClass

  for category in params[:categorisation][:category_ids]

这是我在Stack Overflow上的第一篇文章。如果您还需要其他任何信息,请与我们联系。

提前致谢。

P.S。我在文本编辑器中使用HAML。

2 个答案:

答案 0 :(得分:0)

您可以向文档模型添加自定义验证:

  

验证:at_least_one_categorisation

然后添加方法,可能类似

  

私有

     

def at_least_one_categorisation

if categorisations.size == 0
  errors.add :document, 'At least one cat. is required'
end
     

答案 1 :(得分:0)

使用@GabrieleF的回答,我得出了答案。

我按照建议创建了验证:

validate :at_least_one_categorisation

和方法,如建议:

def at_least_one_categorisation

  if categorisations.size == 0
  errors.add :document, 'At least one cat. is required'
  end
end

然后我需要添加

if(params.has_key?(:categorisation)

进入发生错误的已创建方法,如下所示:

if(params.has_key?(:categorisation))
  for category in params[:categorisation][:category_ids]
    @document.categorisations.build(:document_id => @document.id, :category_id => category)
  end
  @document.categorisations << Categorisation.where(:document_id => @document.id)
end

如果没有选择类别,则上述if变为false,并且没有分类,因此验证会在保存任何内容之前显示错误。

感谢你的帮助,GabrieleF。 现在,我只需要进一步开发它来消除编辑文档中类别的问题。