在验证检查之前调用关联方法

时间:2016-11-17 20:29:49

标签: ruby-on-rails

我有以下型号:

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中做错了什么?

1 个答案:

答案 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?

然后你不会得到任何错误。