显示嵌套属性的验证错误

时间:2016-07-21 14:20:59

标签: ruby-on-rails nested-forms nested-attributes

我有以下关联的两个模型

class Article < ActiveRecord::Base
    has_many :categories
    accepts_nested_attributes_for :categories, reject_if: proc { |attributes| (attributes['user_id'].blank? || attributes['numbers'].blank?) }, :allow_destroy => true
end

class Category < ActiveRecord::Base
belongs_to :article

before_save :mytest

  def mytest
    self.article.phase != Category::STD["author"] && self.article.user_id == self.user_id
  end
end

现在,如果mytest方法的验证失败,那么文章就不会保存。这是预期的行为。但这不会给出任何错误信息。我想显示一条错误消息&#34;你不是管理员&#34;如果mytest方法失败。我怎样才能做到这一点。

2 个答案:

答案 0 :(得分:0)

由于您使用的是自定义验证方法,因此必须手动添加错误。

errors.add(:mystest, :invalid) if self.article.phase != Category::STD["author"] ...

你必须从before_save改为验证

validates :mytest

这将执行您的方法mytest作为验证方法,如果出现错误,它将在对象中插入错误。

当您访问主对象的错误时,

accepts_nested_attributes_for会出现子错误并将其返回给您。

答案 1 :(得分:0)

您需要将错误添加到对象。要么是其中一个属性的基础对象。

def mytest
  valid = self.article.phase != Category::STD["author"] &&
    self.article.user_id == self.user_id
  self.errors.add(:base, 'You are not admin')
  # or self.errors.add(:attribute_name, 'You are not admin')
end

然后在视图中,您可以检查基础上是否存在错误并将其渲染

编辑:根据要求提供更多代码

class Category < ActiveRecord::Base
  belongs_to :article

  validate :mytest

  private

  def mytest
    valid = self.article.phase != Category::STD["author"] &&
      self.article.user_id == self.user_id
    self.article.errors.add(:base, 'Not admin user error')
  end
end

class ArticleController < ApplicationController
  def create
    @article = Article.find(params[:id])
    if @article.update_attributes(article_params)
      redirect_to some_path, notice: 'success message'
    else
      if @article.errors.messages[:base].include? 'Not admin user error'
        flash.now[:alert] = 'You are not admin'
      end
      render :new
    end
  end
end