显示嵌套属性的验证错误

Show validation error for 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 方法验证失败则文章不会保存。这是预期的行为。但这不会给出任何错误信息。如果 mytest 方法失败,我想显示一条错误消息 "You are not admin"。我怎样才能做到这一点。

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

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

你必须从 before_save 更改为验证

validates :mytest

这将执行您的方法 mytest 作为验证方法,它会在对象中插入一个错误以防出错。

accepts_nested_attributes_for 应该得到子错误,并且 return 当您访问主对象的错误时,它会为您提供。

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

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

然后在视图中你可以检查 base 上是否存在错误并渲染它

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

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