2017-06-02 72 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