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
Другие вопросы по тегам