您当前的位置: 首页 > 

Rails多层关系子模型验证错误在父模型中的处理

发布时间:2017-02-02 18:08:50 ,浏览量:0

在Rails的模型中可以用不同的关系联系其他的模型,我们把包含有其他模型的模型称为父模型,而被包含的模型称为子模型,子模型还可以有子模型,可以无穷延续下去.

例如:

class Risk < ActiveRecord::Base has_one :evaluate end class RiskEvaluate < ActiveRecord::Base has_one :level end class RiskLevel < ActiveRecord::Base end

如上所示risk中有一个evaluate,evaluate中又有一个level. 如果在risk验证点上出现risk本身属性的错误(比如save或update),那么risk对象会被置为无效(valid?为false),同时其errors对象中会包含一系列的错误信息. 但是如果是evaluate或level对象的本身属性上出现错误,在risk上是完全体现不出来的,我们必须自己写代码将错误”传递到”risk对象上去.

别忘了在update验证发生错误时要先做 reload操作,因为update_attributes会直接修改risk内存中的数据,所以先要退回.但问题是一旦调用reload,则其中的错误信息都会丢失,所以我们必须自己保存,比如下面一种方法:

class Foo;attr_accessor :errors;end;

    attr :fake_error_object def initialize(*args) super @fake_error_object = self end def set_fake_error_object
        errors = if not risk_evaluate.valid?
            risk_evaluate.errors elsif not risk_evaluate.risk_level.valid?
            risk_evaluate.risk_level.errors else self.errors end @fake_error_object = Foo.new @fake_error_object.errors = errors end

注意Foo类是定义在Risk类内部的,所以不会有命名空间污染的可能.

我们只需在reload之前调用set_fake_error_object即可,你不用担心当数据验证成功时fake_error_object内容的问题,因为此时他会被置为self.errors,此时没有错误.

我们在View中,fake_error对象就派上用途了:

<%= render 'shared/error_messages',object:f.object.fake_error_object %>

现在子模型中的错误也可以在父模型对象中体现出来了 ;)

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    107766博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1055s