Rails: Как проверить, не сработает ли update_attributes?
Чтобы проверить, если 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
4 ответа
Он возвращает ложь, если это не было сделано, то же самое с 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
редактировать
Тогда вы хотите этот метод, который вы должны написать. Если вы хотите предварительно проверить параметры санитарии.
def params_are_sanitary?
# return true if and only if all our checks are met
# else return false
end
Редактировать 2
В качестве альтернативы, в зависимости от ваших ограничений
if Foo.new(params).valid? # Only works on Creates, not Updates
@foo.update_attributes(params)
else
# it won't be valid.
end
Вам лучше проверить это в вашей модели через before_save
before_save :ensure_is_valid
private
def ensure_is_valid
if self.valid?
else
end
end
Метод 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
Возможно, это не лучший ответ, но, похоже, он отвечает на ваш вопрос.
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
конец
Я столкнулся с тем же сценарием - нужно было узнать, действительна ли запись, и выполнить некоторые действия перед сохранением обновления. Я узнал что естьassign_attributes(attributes)
метод, который update
метод использовал раньше 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