У меня есть форма, в которой пользователи вводят информацию профиля, которая сохраняется в модели пользователя. Мне нужно собрать еще одну информацию от пользователей на более позднем этапе (на другой странице). Как мне собрать эту информацию и добавить ее к существующей записи пользователя?

Вот мой код формы с одним дополнительным вводом, который мне нужен от пользователя. Когда я нажимаю "Отправить", он запускается без ошибок, но новое поле не сохраняется в моей модели. Я выполнил миграцию, чтобы добавить поле в модель.

<%= form_for @user, html: { method: :put }) do |f| %>

 <div class="form-group">
  <%= f.label :what_is_your_favorite_color %>
  <%= f.text_field :color, class:"form-control" %>
 </div>

 <div class="form-group">
    <%= f.submit "Submit", class:"btn btn-primary" %>
 </div>

<% end %>

Мой метод обновления контроллера в настоящее время пуст ... вы можете сказать мне, как должен выглядеть метод обновления? Пользователь вошел в систему, поэтому мне нужно найти эту запись пользователя (возможно, по столбцу id?) И записать или обновить новый ввод в модель.

def update
   ??    
end
2
Moosa 18 Авг 2014 в 23:27

1 ответ

Лучший ответ

Сначала вам нужно получить свою запись, передать ей хеш params, а Rails сделает все остальное.

def update
  @record = Record.find(params[:id])
  if @record.update(record_params)
    redirect_to @record
  else
    render :edit
  end
end

Если вы используете Rails 4, вам необходимо учитывать strong_parameters. Поэтому добавьте новый атрибут к разрешенным атрибутам.

  def record_params
    params.require(:record).permit(:color, :and, :other, :attributes, :go, :here)
  end

В приведенном выше коде предполагается, что идентификатор записи будет в хэше params, или, другими словами, вы используете маршруты RESTful. В противном случае вы можете передать идентификатор из сеанса (если это, как вы говорите, пользовательская запись, и вы используете Devise).

def update
  @record = Record.find(current_user)
  # ... the rest should be the same
end
1
Mohamad 18 Авг 2014 в 23:54
Спасибо, я использую Devise для аутентификации, поэтому модель включает такие поля, как пароль, last_sign_in_date и т. Д. Нужно ли мне также включать их в разрешенные атрибуты?
 – 
Moosa
18 Авг 2014 в 23:36
Да, если вы хотите повторно использовать свой метод контроллера для обновления пользователя из разных форм. Итак, если у вас есть несколько форм, отправляющих одно и то же действие контроллера, да, это так.
 – 
Mohamad
18 Авг 2014 в 23:39
В моем пользовательском контроллере нет def record_params. Я предполагаю, что этим занимается драгоценный камень разработки. Мне просто добавить код, как вы предлагаете? Или мне следует добавить новое поле в код драгоценного камня?
 – 
Moosa
18 Авг 2014 в 23:43
Когда я запускаю указанный выше код, я получаю сообщение об ошибке could not find User without an ID. Что это обозначает?
 – 
Moosa
18 Авг 2014 в 23:47
Это означает, что вы, вероятно, не используете маршруты RESTful, как следовало бы. Отредактирую пост.
 – 
Mohamad
18 Авг 2014 в 23:53