gpt4 book ai didi

ruby-on-rails - Rails 3 的更好的 validates_associated 方法?

转载 作者:行者123 更新时间:2023-12-03 13:36:38 26 4
gpt4 key购买 nike

Rails 3 包括 validates_associated保存嵌套模型时会自动调用它。该方法的问题是消息很糟糕 - “模型无效”

对于 Rails 2,有一些帖子针对此问题进行了攻击:

  • http://rpheath.com/posts/412-a-better-validates-associated
  • http://pivotallabs.com/users/nick/blog/articles/359-alias-method-chain-validates-associated-informative-error-message

  • 可能还有更多。最好有这些帖子中描述的更好的版本,它与 Rails 3 兼容。主要的改进是包括相关模型失败的原因。

    最佳答案

    关于关系,可以使用:autosave => true相反,它会在您保存父模型时尝试保存子模型。这将自动运行 child 的验证,他们将报告正确的错误消息。

    此外,如果您在子对象上添加必须设置父对象的存在验证,并通过关联构造子对象,您甚至不需要 autosave标志,你会得到一个漂亮的错误信息。例如:

    class Trip < ActiveRecord::Base
    validates :name, :presence => true

    attr_accessible :name

    has_many :places, dependent: :destroy, :inverse_of => :trip
    end

    class Place < ActiveRecord::Base
    belongs_to :trip

    validates :name, :trip, presence: true

    attr_accessible :name
    end

    然后,您可以通过以下使用场景收到一条不错的错误消息:
    > trip = Trip.new(name: "California")
    => #<Trip id: nil, name: "California">
    > trip.places.build
    => #<Place id: nil, name: nil, trip_id: nil>
    > trip.valid?
    => false
    > trip.errors
    => #<ActiveModel::Errors:0x00000004d36518 @base=#<Trip id: nil, name: "California">, @messages={:places=>["is invalid"]}>
    > trip.errors[:places]
    => ["is invalid"]

    我认为 validates_associated是自动保存 child 之前时代的遗物,不再是最好的做事方式。当然,这不一定有很好的记录。我不是 100% 肯定这也适用于 Rails 2.3,但我有一种感觉。这些更改是在添加嵌套属性功能时出现的(在 2.x 中的某个时候)。

    这是来自 training project I posted on github 的简化代码片段.

    关于ruby-on-rails - Rails 3 的更好的 validates_associated 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3668018/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com