update_attributes не сохраняется в базе данных

Правильные пользовательские параметры отображаются в моей функции отладки после отправки формы, но параметры по умолчанию отображаются при входе в консоль.

контроллер

def update
    current_user.update_attributes(params[:user])
    flash[:success] = "Your settings have been saved!"
    render new_status_update_path
end                                         

модель

attr_accessible :deficit_pct,
              :target_bf_pct,
              :activity_factor

Заметки:

  • Самый близкий вопрос, который я мог бы найти к этому на SO, - это вопрос, который изменяет атрибуты объекта, который существует посредством ассоциации.

  • Я пытался использовать метод Object.update, хотя я получаю сообщение об ошибке:

    закрытый метод "update" вызван для #

Есть идеи?

Спасибо!

4 ответа

Решение

После игры с консолью я обнаружил, что даже если я изменяю атрибуты вручную, атрибуты не "прилипают" после выхода из консоли.

Так что я войду в консоль, поменяю атрибуты пользователей, протестирую их, и они будут изменены. Если я существую и введу заново, ТОГДА проверим их, они вернутся к своим значениям по умолчанию.

Это наводит меня на мысль, что метод after_initialize в пользовательской модели, который устанавливает значения по умолчанию, выполняется после каждого сохранения. Я думал, что он будет работать только после первого сохранения объекта, но теперь я знаю, что он запускается при каждом сохранении.

after_initialize :default_values 

def default_values
  self.goal = "Cut"
  self.measurement = "US"
  self.bmr_formula = "katch"
  self.fat_factor = 0.655
  self.protein_factor = 1.25 
  self.deficit_pct = 0.10
  self.target_bf_pct = 0.10
  self.activity_factor = 1.3
end

Как только я удаляю все эти значения и метод after_initialize, он сохраняется навсегда.

Попробуйте код:-

def update
    if current_user.update_attributes(params[:user])
        flash[:success] = "Your settings have been saved!"
        render new_status_update_path
    else
        p 111111111111
        p  current_user.errors.inspect
    end
end

после проверки вашего журнала на наличие ошибок. существуют для этой активной записи

Что-то вроде:


def update
    if current_user.update_attributes(params[:user])
        flash[:success] = "Your settings have been saved!"
        render new_status_update_path
    else
        some_error_handling_code
    end
end

Не будет отображаться успех при сбое сохранения. Как правило, прежде чем сообщать конечному пользователю об успешном завершении, необходимо проверить, не завершилась ли операция сохранения или любая другая внутренняя операция.

Вы должны убедиться, что у вас нет ошибок проверки. Вы можете проверить их, используя:

active_record_model.errors

В вашем случае это было бы

current_user.errors

Кроме того, вы должны напечатать возвращаемое значение из update_attributes чтобы увидеть, если это true или же false, Если вы получаете falseСохранение было отменено. Скорее всего, это было вызвано ошибками проверки или обратным вызовом false,

Другие вопросы по тегам