注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风之云的足迹

点击这里添加博客描述

 
 
 

日志

 
 

多个model对象的同时验证  

2009-09-18 15:55:20|  分类: Rails |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     由于在提交的时候需要涉及多个model对象的验证,假设为@project和@procedure,同时提交的时候包含一个@project对象和多个@procedure对象,project和procedure存在一对多的关系,保存的时候是用@project.procedure << @procedure把b对象附加到a对象上面,然后调用@project.save的同时会保存和a关联的多个b对象,同时自动调用@project和@procedure对象的model验证,但是这样子验证出错之后@procedure对象的提示信息只是@procedure是无效的,不能精确到具体的哪个字段的错误。
    在网上也找了蛮多方法,但是一直没能实现精确出现提示信息,后面只能在controller中实现验证。
   查看了一下error_messages_for方法的源代码,只是把object.errors对象中存的错误信息循环输出来。所以我在验证的时候不管是@project对象的错误还是@procedure对象的错误,全部调用@project.errors.add_to_base方法当出现错误的时候就存入错误信息,然后再@projectsave之前判断一下@project.errors.on_base是否存在值,如果存在说明有错误信息,跳转到原来的页面(注意:这里的变量需要实力变量@,这样子才能把对象传回到页面中)页面中存在@project对象,然后调用<%=error_message_for "project"%>这样子就可以把存入的错误信息输出来了,可以非常的精确。
   对于多个model 的验证,不知道还有没有更好的方法,但是由于这里涉及到project一个model和procedure的多个model一快保存,而且procedure的多个model有相同错误都给输出来还得知道是哪个procedure的model 的错误,现在只能用再controller中验证,实现起来还比较方便。

project的部门验证代码:
    pname = Project.find_by_name(@project.name)
    if  @project.name.blank?
      @project.errors.add_to_base("项目名称不可为空白")
    elsif pname
      @project.errors.add_to_base("项目名称已存在")
    elsif  @project.name.split(//).size > 30
      @project.errors.add_to_base("项目名称长度超过最大值")
    end

procedure的部分验证代码:
 # 阶段验证信息
            procedure_name = Procedure.find(id).name
            # 在阶段的循环中验证负责人和日期的填写是否正确
            if !@procedureassignees[index]
              @error_assignee << procedure_name.to_s + "负责人不存在"
            end
            if !@expect_begin_date[index].empty? && !@expect_begin_date[index].match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/)
              @error_begin_date << procedure_name.to_s + "预期开始时间格式不正确"
            end
 # 验证前端负责人是否输入正确
    if @front_assignee_error
      @project.errors.add_to_base("前端负责人不存在")
    end
    # 阶段信息的错误信息收集
    if @error_assignee && !@error_assignee.empty?
      @error_assignee.each do |error_assignee|
        @project.errors.add_to_base(error_assignee)
      end
    end



  评论这张
 
阅读(391)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018