2016-11-17 56 views
2

我有以下型號:invoke方法

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 

我不知道爲什麼「名稱不能爲空「的錯誤數組顯示在錯誤數組中時,我在before_validation回調中爲該名稱指定了一個值。我在Rails 4.2中做了什麼錯誤?

回答

0

self.name

在下面的語句,

self.name ||= 'Unknown Task' 

值將被分配給name如果name是falsy(零或假)。但如果self.name爲空字符串(「」),則上述語句將不會將任何值分配給self.name

我認爲,在你的情況下,self.name是一個空白的字符串,它不是一個虛假的值。所以它將保持爲空白字符串。並根據presence驗證檢查該值是否爲空(意味着空白和零值不被允許),錯誤將被拋出。

嘗試更改同一行

self.name = 'Unknown Task' if self.name.blank? 

那麼你不會得到任何錯誤。

+0

這是一個很好的觀點。我會檢查這是否是問題。 – Donato