显示嵌套属性的验证错误
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
我有两个模型具有以下关联
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