我有以下关联的两个模型
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方法失败。我怎样才能做到这一点。
答案 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