0

Я хотел бы добавить колонку в users под названием points и обновить ее в разное время. Однако, когда я изменяю значение столбца «Пользователь», Пользователь выписывается, поскольку токен для запоминания для пользователя изменяется и не совпадает с тем, который хранится локально.Как я могу изменить значение Пользователя без подписания Пользователя?

Я могу вручную подписать пользователя каждый раз, когда я обновляю столбец в контроллере, но я хочу избежать этого, если это возможно (и уметь обновляться с модели). Есть ли способ обновить пользователя, не выписывая его?

ответ

0

Я понял, что проблема заключалась в том, что новый токен генерируется с обратным вызовом before_save всякий раз, когда пользователь сохраняется. Поэтому я могу исправить это двумя способами:

  1. Изменить before_save на before_create.
  2. Пользователь update_column для обновления столбца без вызова обратных вызовов before_save.
1

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

+0

Это не с драгоценным камнем. Аутентификация аналогична аутентификации, используемой Railscasts и Railstutorial. http://railscasts.com/episodes/250-authentication-from-scratch http://ruby.railstutorial.org/chapters/sign-in-sign-out – Ari

0

Проще всего хранить @user.id в переменной сеанса, а не весь объект User. При таком подходе, даже после редактирования, вы сохраните стабильное поле id, на которое вы можете ссылаться.

Это имеет несколько преимуществ:

  1. Это более безопасно. Сеансы Rails трудно подделать, но легко читать. Таким образом, теперь вам не нужно беспокоиться о каких-либо безопасных или полусекретных данных в вашем cookie-сеансе, которые могут быть утечены путем встраивания всего пользователя.
  2. Весь объект потенциально большой. Каждый запрос имеет сериализованный объект User, идущий туда и обратно без уважительной причины.

Это легко подключить к контроллеру приложения, поэтому прозрачно использовать id вместо реального объекта User.

class ApplicationController < ActionController::Base 
    def current_user 
     User.find(session[:user_id]) 
    end 
.... 

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

Смежные вопросы