我有以下型号:
module FullcalendarEngine
class Event < ActiveRecord::Base
belongs_to :task
accepts_nested_attributes_for :task
end
end
class Task < ActiveRecord::Base
has_one :fullcalendar_engine_event, class_name: 'FullcalendarEngine::Event'
validates :name, presence: true
before_validation :check_if_event
def check_if_event
self.name ||= ( fullcalendar_engine_event.present? ? (fullcalendar_engine_event.title || fullcalendar_engine_event.event_category.name) : nil)
self.name ||= 'Unknown Task'
end
end
以我的形式:
...
<%= f.fields_for :task, f.object.task do |task_builder| %>
...
现在我收到一个阻止保存的验证错误:
Task name can't be blank
虽然调用了check_if_event方法(我使用ruby调试器并在那里放置断点),但不存储名称赋值。如果是,那么这个错误就不会发生。
此answer建议在事件中添加validates_associated
,如下所示:
accepts_nested_attributes_for :task
validates_associated :task
但所有这一切都是在错误数组中添加一个额外的错误:
Task name can't be blank
Task is invalid
我不知道为什么名字不能为空白&#39;当我在before_validation
回调中为名称指定值时,会出现在errors数组中。我在Rails 4.2中做错了什么?
答案 0 :(得分:0)
self.name
是否?
在以下声明中,
self.name ||= 'Unknown Task'
如果name
是假的(零或假),则值将分配给name
。但如果self.name
为空字符串(&#34;&#34;),则上述语句不会为self.name
分配任何值。
我认为,在您的情况下,self.name
是一个空字符串,它不是一个假值。所以它将保持为空白字符串。并且根据presence验证检查值是否为空(表示空白且不允许nil值),将抛出错误。
尝试将同一行更改为
self.name = 'Unknown Task' if self.name.blank?
然后你不会得到任何错误。