Rails 5 принадлежит_от_required_by_default не работает

Я использую Rails 5.0.0, но по какой-то причине belongs_to_required_by_default не работает!

Приложение было создано в качестве новых рельсов 5 приложений

class Visit < ApplicationRecord
  belongs_to :user
end

> v = Visit.new
> v.valid? # => true

он работает только с опцией optional: false

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

> v = Visit.new
> v.valid? # => false

но почему не работает конфигурация:

Rails.application.config.active_record.belongs_to_required_by_default = true

Спасибо за любые предложения

Ответ 1

Где вы его положили? Подтвердите это, положив его в development.rb как config.active_record.belongs_to_required_by_default = true внутри Rails.application.configure do.

Если вы хотите это для всего, вы можете поместить его в application.rb под класс Application < Rails::Application как config.active_record.belongs_to_required_by_default = true

Я считаю, что вы найдете его в каталоге инициализаторов, будет иметь проблемы с порядком загрузки.

Ответ 2

РЕДАКТИРОВАТЬ ДЛЯ ЖЕЛЕЗНЫХ ДОРОГ 5.1: Все должно работать хорошо в приложении Rails 5.1 по умолчанию. Просто убедитесь, что config.load_defaults 5.1 находится в вашем приложении .rb(ссылка).

OLD ANSWER FOR RAILS 5.0.x

Похоже, что это связано с некоторыми драгоценными камнями, которые неправильно активируют патч-амуницию в соответствии с этой проблемой Rails https://github.com/rails/rails/issues/23589.

Вы можете захотеть комментировать/раскомментировать их в своем Gemfile, пока не найдете виновника.

После этого утомительного процесса я обнаружил, что для моего последнего проекта это были камни ahoy_matey, cancancan и delayed_job_active_record, которые вызвали проблему (на момент написания).

Тем временем ответ Ropeney работает, хотя и не идеален, так как "официальный путь рельсов" заключается в объявлении config.active_record.belongs_to_required_by_default = true в инициализаторе new_framework_default‌​s.rb, а не в application.rb.

Ответ 3

Если у кого-то все еще есть эта проблема, вы можете перейти на Rails 5.1, чтобы исправить ее. В Rails 5.1, config/initializers/new_framework_defaults.rb был удален и заменен линией config.load_defaults 5.1 в application.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

См. конец этой темы для более подробной информации: https://github.com/rails/rails/issues/23589.