【问题标题】:Rails 6 app not validating belongs_to associationsRails 6应用程序未验证belongs_to关联
【发布时间】:2021-08-14 06:27:19
【问题描述】:

我有一个 Rails 引擎,它封装了我的应用程序的一部分功能。我在引擎中有一堆模型,它们定义了各种 belongs_to 关联。从 Rails 5 开始,这些关联应该是默认需要的,除非在定义中指定了 optional: true

我仍然能够创建模型实例而不会出现任何验证错误。我没有在任何关联上指定optional: true,也没有在任何地方设置配置选项config.active_record.belongs_to_required_by_default。此外,它无论如何都在 rails 6 中被删除了。

我想不出模型实例不会验证失败的任何原因。我希望具有未定义的 belongs_to 关联的任何模型的任何实例都将无效并引发错误。为什么这些记录会通过验证?

【问题讨论】:

  • 查看源代码...github.com/rails/rails/blob/…。似乎只有在 model.belongs_to_required_by_default 设置为 false 或 required 设置为 false 时才会发生。
  • @dbugger 好吧,这很有趣——我在那个文件中设置了一个断点,看起来required 设置在第 118 行:required = model.belongs_to_required_by_default 但是,belongs_to_required_by_default 只是零;它没有在我的应用程序中的任何地方设置,我可以看到它设置的唯一位置是github.com/rails/rails/blob/… 第 91 行。该行位于仅在 target_version 为 5.0 时运行的块内。如果从未设置该值,我看不出Belongs_to required 是如何成为默认行为的。
  • 所有情况 >= 5.1 包括一行,例如 load_defaults "5.0",因此也为 rails 6 设置了默认值。另请参阅 guides.rubyonrails.org/…,其中显示“这样通过,例如,6.0还从之前的每个版本中获取新的默认值。”并且只有来自 5.0 的 default = true
  • @MatthiasWinkelmann 感谢您指出这一点,这对我之前的问题很有意义。
  • 您可以随时在控制台中查看此项。看看返回了什么Rails.application.config.active_record.belongs_to_required_by_default

标签: ruby-on-rails activerecord


【解决方案1】:

感谢@MatthiasWinkelmann 的提示,我找到了我的问题。事实证明我的引擎根本没有调用load_defaults。我需要将以下内容添加到 spec/dummy/config/application.rb:

module Dummy
  class Application < Rails::Application
    config.load_defaults Rails::VERSION::STRING.to_f

    ... etc ....
  end
end

这是一篇包含更多解释的文章: An upgraded Rails gem does not upgrade your Rails configuration

我可能会做得更好,在我的问题中提到我正在将我的应用程序从 Rails 4.2 升级到 6.1。这一变化是在 Rails 5 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多