问题描述
collate_fn
关注
@foreach (var item in Model.AvaliableCategories)
{
if (item.Selected)
{
<option value="@item.Value" selected="selected">@item.Text</option>
}
else
{
<option value="@item.Value">@item.Text</option>
}
}
在我的
项目模型我有 class Project
include Listable
listtable(data_attribute: :verified_at)
end
列。如果我的表中没有 verify_at 列,它应该会引发错误。
但是这里没有正确响应。总是引发错误(甚至verified_at也存在)
预期
无论我在模型中的何处包含此问题,它都应该检查 Verified_at 列是否存在。如果不存在,则应引发错误。
这对我来说没有发生,请建议我任何解决方案,提前致谢
解决方法
问题在于模型没有按照您预期的方式respond_to?
。
Project.respond_to?(:id)
# false
为什么?因为您是在询问类本身是否具有 id
属性,该属性仅适用于实例。
Project.first.respond_to?(:id)
# true
要解决此问题,您可以像这样利用 Project.column_names
方法。
raise ActiveModel::MissingAttributeError,"Must have a verified_at attribute" unless column_names.include?('verified_at')
,
Listable
模块在这里不是绝对必要的。 Rails 带有开箱即用的 ActiveRecord 验证,类似这样的事情可以满足您的需求:
class Project
validates :verified_at,presence: true
end
然后您可以实例化一个 Project
并检查它是否有效。如果 .valid?
返回 false,则无法将其保存到数据库中:
project = Project.new
=> #<Project:0x00007ff3aec268a8
id: nil,verified_at: nil,created_at: nil,updated_at: nil>
project.valid?
=> false
project.save!
=> ActiveRecord::RecordInvalid: Validation failed: Verified At can't be blank
project = Project.new(verified_at: Time.zone.now)
=> #<Project:0x00007ff3aec268a8
id: nil,verified_at: Mon,11 Jan 2021 04:09:24 EST -05:00,updated_at: nil>
project.valid?
=> true
project.save!
# DB query
=> true
一些阅读:https://guides.rubyonrails.org/active_record_validations.html