我目前正在尝试显示我在控制器内部添加到用户对象的错误,同时在模型中进行验证。
就好像我的控制器中有错误它会立即显示然后返回而不显示模型中的错误,我知道如果我的错误已经完成计数并且不是一个一个地显示它们就必须返回
我甚至编写了一个验证方法,该方法应该检查模型中的验证并将它们保存到我的对象,然后显示错误方法可以显示所有错误,包括在模型中找到的错误。
我的控制器方法就像这样
def info
if @user.firstname != "" && @user.lastname != "" && @user.id_number != "" && @user.email != ""
@user.errors.add_to_base("Password can't be blank")
end
end
def validations()
@errors = User.check_validations
end
def display(template_to_render)
if @user.errors.count >= 1
render :action => template_to_render
end
end
然后我在模型中的方法如下
def self.check_validations validates_presence_of :firstname, :lastname, :date_of_birth, :if => Proc.new { |o| o.force_update? || o.profile_confirmed? } end
然后我想将验证方法的所有错误添加到@ user.errors.to_base错误中 并将它们全部显示出来。
所以我想知道是否有任何方法可以用来检查模型中的方法并将所有这些错误添加到@user对象,然后才能在视图上显示。
答案 0 :(得分:1)
一些事情。
所有验证都应该放在模型中,不应该在控制器中调用errors.add
。
validates_presence_of
是一个类方法,用于定义应该进行的验证。验证不会发生在那个确切的时刻。因此,您不能在每个请求的基础上使用它。
如果您只想进行一次验证,然后再验证模型的其余部分,请尝试此操作。
class User < ActiveRecord::Base
validate :check_password
validates_presence_of :firstname, :lastname, :date_of_birth, :if => Proc.new { |o| o.force_update? || o.profile_confirmed? }
def check_password
if firstname != "" && lastname != "" && id_number != "" && email != ""
errors.add_to_base("Password can't be blank")
end
end
end
然后,您可以直接调用check_password,仅在需要时验证。
def info
@user.check_password
end
def validations
@user.valid? # triggers validations
@errors = @user.errors
end
def display(template_to_render)
if @user.errors.count >= 1
render :action => template_to_render
end
end
我假设这些方法都在一个请求中被调用,并且它们不是每个单独的控制器操作。
答案 1 :(得分:0)
您在“self.check_validations”中所做的是在每次控制器运行时添加验证。在1000个请求之后,您将有1000个验证添加到模型和崩溃的应用程序(可能)。
在Rails文档中查找“条件验证”,这将解释如何实现您想要的目标。
你也可以调查.save!和.create!如果模型无效,您将获得异常的方法 - 这允许您以更明确的方式更改控制流