before_save 如果attribute.present?

Ant*_*com 3 ruby methods ruby-on-rails before-save

before_save :date_started_sets_deadline, if date_started.present?
Run Code Online (Sandbox Code Playgroud)

我不希望它before_save运行 if :date_started == nil。我已经尝试了上述行的各种版本,所以不确定是否必须更改它或方法本身。

def date_started_sets_deadline
  if self.date_started > Date.tomorrow
    self.deadline = self.date_started
  end
end
Run Code Online (Sandbox Code Playgroud)

NoMethodError (undefined method '>' for nil:NilClass): app/models/challenge.rb:35:in 'date_started_sets_deadline'每当用户尝试创建挑战时,我都试图避免该错误date_started

Dha*_*udi 5

before_save语句更改为以下内容:

before_save :date_started_sets_deadline, if: :date_started?

如果您提供一个 symbolif,然后rails评估它在该实例的情况下。通过添加?,它是一个自动生成的方法,本质上与date_started.present?.

另外,如果 date_started中需要date_started_sets_deadline,我还将显式添加检查,而不是仅依赖if于在回调逻辑上添加条件。

def date_started_sets_deadline
  if self.date_started.present? && (self.date_started > Date.tomorrow)
    self.deadline = self.date_started
  end
end
Run Code Online (Sandbox Code Playgroud)

请参阅使用 :if 和 :unless 与符号获取更多信息。