Rails: как хранить данные в сеансе?

Я делаю приложение для веб-приложений для написания экзаменов в Rails. Проблема в том, что если ответы пользователей будут отправлены в Интернет, они будут легко обнаружены ETS. Поэтому, когда пользователи снова напишут свои ответы в реальном тесте, ETS подумает, что они справляются с ответами из Интернета и дают им довольно низкий балл.

Мой подход к этому - это сохранить сеанс пользователя в сеансе. Таким образом, он не будет загружаться в Интернет вообще. Но как я могу хранить объект в сеансе?

Ответ 1

Чтобы сохранить что-то в сеансе, вы можете сделать:

session[:answer] = "some answer"

Затем вы можете позвонить с помощью:

session[:answer]

Или вы можете использовать HTML5 localstorage:

<script>
  localStorage.setItem("essay", "text");
  localStorage.getItem("essay"); // => "text"
</script>

Ответ 2

  • Rails хранит данные в базе данных (не обязательно в "Интернете" )
  • Сохранение большого количества данных в сеансах - действительно плохая идея.

Сессия

Rails-сессии предназначены для обеспечения согласованности во всем приложении

IMO, сеансы лучше всего использовать для хранения "фрагментов" данных (таких как один объект, ids и т.д.) и лучше всего используются для этих типов функций:

  • Тележки для покупок
  • Системы безопасности (сохранение защищенных данных)
  • Аутентификация (ведение входа пользователя)

База данных

Что вы спросили, как вы храните ответы пользователей в сеансах

Я бы сказал, что вы должны хранить их в базе данных, но защищать эту БД с помощью authentication (например, Devise):

#app/controllers/answers_controller.rb
def new
    @answer = Answer.new
end

def create
    @answer = Answer.new(answer_params)
    @answer.save
end

private

def answers_params
     params.require(:answer).permit(:body, :question_id).merge(user_id: current_user.id)
end 

Это позволит вам хранить ответы в базе данных (база данных может быть на вашем локальном компьютере, локальной интрасети или где угодно)


Безопасность

Ключ для вас будет заключаться в защите ваших данных

Это называется Authentication, и, не вдаваясь в подробности, вот отличный ресурс для вас:

http://railscasts.com/episodes/250-authentication-from-scratch

enter image description here

Ответ 3

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

Технически это неверно. По умолчанию реализация сеансов в рельсах основана на файлах cookie. Поэтому, если вы пишете что-то на сессии, оно записывается в файл cookie на клиенте. При каждом следующем запросе на ваш сервер cookie отправляется на сервер, который, как я полагаю, каким-то образом связан с Интернетом.

Кроме того, файлы cookie и, следовательно, сеансы ограничены по размеру (около 4kb). Таким образом, вы не сможете хранить все в сеансе.

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

Настоящий вопрос здесь:

Обычно, если вы не хотите, чтобы другие люди (например, ETS) могли читать ваш контент, вы ограничиваете доступ к контенту. Либо паролями, либо другими способами.

Итак, используйте некоторую аутентификацию (ответ by @Rich Peck), будьте осторожны, чтобы ваш контент был виден только после успешной аутентификации, не передавайте пароли в ETS, и вы должны быть в порядке.