我正在使用 Rails Admin gem。当我添加新的活动类型并使用相同的名称再次创建它时,它会验证该名称是否已被采用。但是每当我尝试编辑一个时,它都会给你一个错误:"名称不能为空">
例如,我创建了游泳,并尝试添加一个新的活动类型,即游泳/游泳等。为了避免这种情况,我使用了before_validation
回调,使第一个字母大写,然后检查name
的唯一性。
是的,它正在工作,但是每当我尝试编辑name
字段时,提交后它都会变为空白。
注意:我也尝试在没有before_validation
的情况下仅使用validates :name, presence: true, :uniqueness => {:case_sensitive => true}
,但它不起作用。
活动类型
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!
会返回nil
.如果将其更改为"".capitalize
,则将按预期返回空白字符串。
此外,如果未进行任何更改,capitalize!
将返回 nil。请参阅 https://ruby-doc.org/core-2.2.0/String.html#method-i-capitalize-21。