如何在模型中的容器中保存错误并将其显示在控制器中

时间:2009-08-13 11:23:06

标签: ruby-on-rails ruby

我目前正在尝试显示我在控制器内部添加到用户对象的错误,同时在模型中进行验证。

就好像我的控制器中有错误它会立即显示然后返回而不显示模型中的错误,我知道如果我的错误已经完成计数并且不是一个一个地显示它们就必须返回

我甚至编写了一个验证方法,该方法应该检查模型中的验证并将它们保存到我的对象,然后显示错误方法可以显示所有错误,包括在模型中找到的错误。

我的控制器方法就像这样

 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对象,然后才能在视图上显示。

2 个答案:

答案 0 :(得分:1)

一些事情。

  1. 所有验证都应该放在模型中,不应该在控制器中调用errors.add

  2. validates_presence_of是一个类方法,用于定义应该进行的验证。验证不会发生在那个确切的时刻。因此,您不能在每个请求的基础上使用它。

  3. 如果您只想进行一次验证,然后再验证模型的其余部分,请尝试此操作。

    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!如果模型无效,您将获得异常的方法 - 这允许您以更明确的方式更改控制流