【问题标题】:Rails Administrate sets presence validation by defaultRails Administrate 默认设置存在验证
【发布时间】:2017-01-16 08:42:50
【问题描述】:

我有一个使用Rails Administrate gem 构建的管理界面。

这很烦人,因为它在 belongs_to 模型上设置了存在验证。

Location.validators_on(:parent)
=> [#<ActiveRecord::Validations::PresenceValidator:0x0000000507b6b0  @attributes=[:parent], @options={:message=>:required}>, #  <ActiveRecord::Validations::LengthValidator:0x0000000507a710 @attributes=  [:parent], @options={:minimum=>1, :allow_blank=>true}>]

如何跳过此验证?

【问题讨论】:

标签: ruby-on-rails ruby rails-administrate


【解决方案1】:

由于 Rails 5.0 belongs_to 默认为 required: true,这意味着它会自动添加对关联对象存在的验证。见blog post about this change

要禁用此行为并恢复 Rails 5.0 之前的行为,请将模型中的 belongs_to 定义从

belongs_to :parent

belongs_to :parent, optional: true

【讨论】:

    【解决方案2】:

    您可以覆盖控制器功能

    # app/controllers/admin/locations_controller.rb
    
        class Admin::LocationsController < Admin::ApplicationController
    
          # Overwrite any of the RESTful controller actions to implement custom behavior
          def create
            @location = Location.new(location_params)
            if @location.save(false)
              # do something
              else
                # handle error
              end
          end
    
        end
    

    【讨论】:

      【解决方案3】:

      Rails 5 似乎带有一个new_framework_defaults.rb 文件,位于/config/initializers/

      我所要做的就是设置

      # Require `belongs_to` associations by default. Previous versions had false.
      Rails.application.config.active_record.belongs_to_required_by_default = false
      

      我很高兴。

      【讨论】:

      • 这将禁用整个应用程序的此功能。 IMO 使用不遵循 Rails 约定的应用程序设置不是一个好主意。选择性禁用belongs_to 对我来说似乎是更好的主意。因为它提醒开发人员他们在应用程序中有一些技术债务应该修复和重构,并且它确保新的belongs_to 关联将按照约定构建。尤其是new_framework_defaults.rb 旨在简化 Rails 5.0 升级,但不应用作永久解决方案。
      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 2015-11-18
      • 2015-05-14
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多