2016-09-30 1 views
-1

У меня есть форма, которая принимает целое число для атрибута пользователя, называемого calories:, и я хочу, чтобы вводимое целое число добавлялось к текущему значению, а не заменяло его. Поэтому мой вопрос в основном: как я могу принять значение ввода формы и использовать его для увеличения количества калорий?Как добавить целое число к атрибуту с помощью формы в рельсах?

Ok так вот форма, в моей пользователей/зрения шоу:

<div class="row"> <div class="col-md-8"> <%= form_for @user do |f| %> <div class="form-group"> <%= f.label "Add calories" %> <%= f.number_field :calories, class: 'form-control'%> </div> <div class="form-group"> <%= f.submit "Add", class: 'btn btn-success' %> </div> <% end %> </div> </div>

и мое действие обновления в моем users_controller:

def update 
    @user = current_user 
    @user.assign_attributes(user_params) 
end 

private

def user_params params.require(:user).permit(:calories) end

+0

Пожалуйста, поделитесь код ... – 7urkm3n

+0

вы могли бы показать код обновления с контроллера и код формы из представления? –

ответ

0

Предположительно, у вас есть объект @user и значение params [: calories] (ваши имена могут отличаться). В вашем действии по обновлению вы сделаете так:

previous_calories = @user.calories 
final_calories = previous_calories + params[:calories] 
@user.update_attributes(calories: final_calories) 

То есть, как это сделать на высоком уровне. Я бы на самом деле извлечь это в модели методы на пользователе, как это:

def update_calories(calories) 
    previous_calories = self.calories 
    total_calories = previous_calories + calories 
    self.update_attribute(calories: total_calories) 
end 
+0

Это похоже на то, что я ищу. Поэтому я попробовал этот первый бит кода в своем действии по обновлению, и я получил эту ошибку, когда пытался добавить калории. «nil не может быть принудительно введен в Fixnum» для строки 'final_calories = previous_calories + params [: calories]' –

+0

Это означает, что либо ваши параметры [: калории] равны нулю, либо ваш self.calories равен нулю. Ваша форма выглядит хорошо, поэтому я собираюсь принять ее позже. Вы можете изменить 'previous_calories = self.calories' на' previous_calories = self.calories || 0', который должен избавиться от ошибки, если ваши параметры верны. Как показано ниже, Эрик может быть хорошей идеей инициализировать калории со значением по умолчанию 0, и в этом случае вам не понадобится код выше. –

+1

Ах, проблема у меня была с параметрами. Мне нужно было добавить '[: user]'. И теперь это работает. Спасибо за вашу помощь! –

0

Если вы ВСЕГДА будете добавлять новое значение калорий в сохраняемое значение калорий, вы можете переопределить сеттер в модели пользователя для выполнения это при сохранении записи пользователя.

def calories=(value) 
    self[:calories] += value 
end 

Я предполагаю, что вы установили по умолчанию калории в процессе миграции?

t.integer :calories, default: 0 

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

enter image description here