在 Rails 管理中使用 before_validation 时字段变为空白

Field becomes blank when before_validation is used in Rails Admin

我正在使用 Rails 管理员 gem。当我添加一个新的 activity 类型并使用相同的名称再次创建它时,它会验证该名称已被使用。但每当我尝试编辑一个时,它都会给你一个错误:"name can't be blank"

例如,我创建了 Swimming,我尝试添加一个新的 activity 类型,即 swimming/SWIMMING 等。为了避免这种情况,我使用了 before_validation 回调,使首先字母大写,然后检查 name 的唯一性。

是的,它工作正常,但每当我尝试编辑 name 字段时,它在我提交后会变成空白。

注意:我也尝试过只在没有 before_validation 的情况下使用 validates :name, presence: true, :uniqueness => {:case_sensitive => true} 但它没有用。

Activity类型

class ActivityType < ApplicationRecord
  before_destroy :ensure_has_no_activity_type
  before_validation :capitalize_first_letter_name
  has_many :activities

  validates :name, presence: true,:uniqueness => {:case_sensitive => true}, length: { maximum: 20 },format: Utilities::RegexValidations.alphanumeric_underscore
  validates :description, presence: false

  private

  def ensure_has_no_activity_type
    if activities.present?
      errors.add(:base, 'Cannot delete activity type that has activity')
    throw(:abort)
    end
  end
  def capitalize_first_letter_name
    # Capitalize the first letter and the rest will be small letter
    self.name = self.name.capitalize!
  end

end

问:为什么每次我尝试编辑并尝试提交时,名称字段都会变成空白?这是什么原因?

问题来自capitalize_first_letter_name"".capitalize! 将 return nil。如果您将其更改为 "".capitalize,那将 return 为预期的空白字符串。

此外,如果不进行任何更改,capitalize! 将 return 为零。参见 https://ruby-doc.org/core-2.2.0/String.html#method-i-capitalize-21