要检查buyer.save
是否会失败,请使用buyer.valid?
:
def create
@buyer = Buyer.new(params[:buyer])
if @buyer.valid?
my_update_database_method
@buyer.save
else
...
end
end
我如何检查update_attributes
是否会失败?
def update
@buyer = Buyer.find(params[:id])
if <what should be here?>
my_update_database_method
@buyer.update_attributes(params[:buyer])
else
...
end
end
答案 0 :(得分:14)
如果没有完成则返回false,与save
相同。如果您更喜欢,save!
会抛出异常。我不确定是否有update_attributes!
,但这是合乎逻辑的。
只是做
if @foo.update_attributes(params)
# life is good
else
# something is wrong
end
http://apidock.com/rails/ActiveRecord/Base/update_attributes
然后你想要这个方法你必须写。如果你想预先检查params卫生。
def params_are_sanitary?
# return true if and only if all our checks are met
# else return false
end
或者,取决于您的约束
if Foo.new(params).valid? # Only works on Creates, not Updates
@foo.update_attributes(params)
else
# it won't be valid.
end
答案 1 :(得分:1)
如果object无效,方法update_attributes
将返回false。所以只需使用这种结构
def update
if @buyer.update_attributes(param[:buyer])
my_update_database_method
else
...
end
end
如果您的my_update_database_method
必须在update_attributes
之前调用,那么您应该使用合并方式,可能是这样的:
def update
@buyer = Buyer.find(params[:id])
@buyer.merge(params[:buyer])
if @buyer.valid?
my_update_database_method
@buyer.save
else
...
end
end
答案 2 :(得分:1)
这可能不是最好的答案,但它似乎回答了你的问题。
def self.validate_before_update(buyer)#parameters AKA Buyer.validate_before_update(params[:buyer])
# creates temporary buyer which will be filled with parameters
# the temporary buyer is then check to see if valid, if valid returns fail.
temp_buyer = Buyer.new
# populate temporary buyer object with data from parameters
temp_buyer.name = buyer["name"]
# fill other required parameters with valid data
temp_buyer.description = "filler desc"
temp_buyer.id = 999999
# if the temp_buyer is not valid with the provided parameters, validation fails
if temp_buyer.valid? == false
temp_buyer.errors.full_messages.each do |msg|
logger.info msg
end
# Return false or temp_buyer.errors depending on your need.
return false
end
return true
端
答案 3 :(得分:1)
你最好通过before_save
在你的模型中检查它before_save :ensure_is_valid
private
def ensure_is_valid
if self.valid?
else
end
end
答案 4 :(得分:0)
我遇到了相同的情况-需要知道记录是否有效,并在更新保存之前执行一些操作。我发现update
方法在assign_attributes(attributes)
之前使用了save
方法。因此,如今这样做可能是正确的:
def update
@buyer = Buyer.find(params[:id])
@buyer.assign_attributes(params[:buyer])
if @buyer.valid?
my_update_database_method
@buyer.save
else
...
end
end