2017-06-02 52 views
0

我打電話給@foo.update,在其中更新的屬性中,我調用foo的模型類中的寫入方法(def attribute=),並希望它有條件地更新整個更新。我可以在那裏放什麼?我嘗試使用errors[:base],但它不會失敗save。我無法使用validates,因爲該屬性在保存之前會轉換爲其他屬性。手動失敗#update_attributes保存在Rails中

def attribute=(attr) 
    if bar 
     # code to fail entire db save 
    end 
    end 
+0

你是怎麼嘗試使用錯誤[:base]? –

+0

是否引發錯誤並捕獲保存選項之外的內容? –

+0

@ruby_newbie我把它放在'if bar'條件的上面,出現錯誤[:base] <<「failed」' – stackjlei

回答

1

你可以只檢查一個before_save回調狀態模型foo.rb並返回false如果你不想保存它。

before_save :really_want_to_save? 

private 

def really_want_to_save? 
    conditional_says_yes ? true : false 
end 

如果你想的錯誤消息太多,那麼

def really_want_to_save? 
    if conditional_says_yes 
    true 
    else 
    errors[:base] << "failed" 
    false 
    end 
end 
+0

使用'before_save'與驗證有什麼區別?一個人在另一個之前? 'before_save'是否在setter方法之前? – stackjlei

+0

'before_save'在'validations'之前運行,其背後的想法是,如果您想在驗證和/或保存模型之前操作某些屬性。 –

+0

但在這裏返回false會取消整個保存? – stackjlei

0

如果你想從模子中中止,然後拋出一個異常就足夠了。

def attribute=(attr) 
    if bar 
     raise "Couldn't save because blah blah" 
    end 
    end 

但是,正如其他帖子中提到的,在保存之前可能會更好地執行此檢查。這就是驗證的目的。

validate :my_condition 

def my_condition 
    if bar 
    errors.add(:base, "Couldn't save because blah blah") 
    end 
end 
+0

會提高錯誤取消整個保存? – stackjlei

+0

@stackjlei:這就是我說的,不是? –

+0

如果我想讓它默默地失敗,該怎麼辦? – stackjlei