Rails 5 belongs_to_required_by_default不起作用

Ole*_*huk 16 ruby-on-rails

我使用Rails 5.0.0,但由于某种原因belongs_to_required_by_default不起作用!

应用程序创建为新的rails 5 app

class Visit < ApplicationRecord
  belongs_to :user
end

> v = Visit.new
> v.valid? # => true
Run Code Online (Sandbox Code Playgroud)

它只适用于optional: false选项

class Visit < ApplicationRecord
  belongs_to :user, optional: false
end

> v = Visit.new
> v.valid? # => false
Run Code Online (Sandbox Code Playgroud)

但为什么不工作配置:

Rails.application.config.active_record.belongs_to_required_by_default = true
Run Code Online (Sandbox Code Playgroud)

Rop*_*ney 17

你把它放在哪里?已经证实,它的工作原理是把它development.rb作为config.active_record.belongs_to_required_by_default = trueRails.application.configure do.

如果你想要的一切,你可以把它放在application.rb课下Application < Rails::Applicationconfig.active_record.belongs_to_required_by_default = true

我相信你会发现把它放在初始化器目录中会出现加载顺序问题.

  • 是的,它适用于您的答案,但我不明白,为什么它不从初始化程序文件夹初始化? (2认同)

Jer*_*ert 10

编辑RAILS 5.1:一切都应该在默认的Rails 5.1应用程序上运行良好.只需确保config.load_defaults 5.1在您的application.rb(参考)中.

RAILS 5.0.x的旧答案

根据这个Rails问题https://github.com/rails/rails/issues/23589,看起来这是因为某些宝石错误地修补了补丁活动记录.

您可能希望在Gemfile中对它们进行注释/取消注释,直到找到罪魁祸首.

这一繁琐的过程后,我发现,我的最新项目是宝石ahoy_matey,cancancandelayed_job_active_record导致该问题(在写作的时候).

与此同时,Ropeney的答案有效,虽然并不理想,因为"官方轨道方式"是config.active_record.belongs_to_required_by_default = truenew_framework_default??s.rb初始化器中声明,而不是在application.rb.


小智 5

如果有人仍然遇到此问题,您可以升级到Rails 5.1来修复它.在Rails 5.1中,config/initializers/new_framework_defaults.rb已被删除并替换为config.load_defaults 5.1application.rb.此行包括其中 active_record.belongs_to_required_by_default = true的其他选项new_framework_defaults.rb.

module myApp
 class Application < Rails::Application
 # Initialize configuration defaults for originally generated Rails 
 version.
  config.load_defaults 5.1
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此主题的结尾:https://github.com/rails/rails/issues/23589.