【问题标题】:Rails: How to store data in session?Rails:如何在会话中存储数据?
【发布时间】:2014-03-30 16:21:45
【问题描述】:

我正在 Rails 中制作一个写作考试练习网络应用程序。问题是如果用户的答案被提交到互联网上,他们很容易被 ETS 检测到。所以当用户在真实测试中再次写出答案时,ETS 会认为他们是在应对来自互联网的答案,并给他们一个相当低的分数。

我的方法是在会话中存储用户的文章。所以它根本不会上传到互联网。 但是,如何在会话中存储对象?

【问题讨论】:

  • 我认为在会话中存储完整的论文不是一个好主意,您保存为论文的偏执记录并将essay_id存储在会话中。

标签: ruby-on-rails session


【解决方案1】:

要在会话中存储某些内容,您可以这样做:

session[:answer] = "some answer"

然后您可以使用以下方式调用答案:

session[:answer]

或者你可以使用 HTML5 本地存储:

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

【讨论】:

【解决方案2】:
  1. Rails 将数据存储在数据库中(不必在“Internet”上)
  2. 在会话中存储大量数据是一个真的坏主意

会话

Rails sessions 旨在保持整个应用程序的一致性

IMO,会话最适合用于存储“sn-ps”数据(例如单个对象、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 

这将允许您将答案存储在数据库中(数据库可以在您的本地计算机、本地 Intranet 或您想要的任何地方)


安全

您的关键是保护您的数据

这称为Authentication,无需详细说明,这里有一个很好的资源:

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

【讨论】:

    【解决方案3】:

    我的方法是在会话中存储用户的文章。所以会 根本不能上传到互联网。

    从技术上讲,这是不正确的。 rails 中会话的默认实现是基于 cookie 的。因此,如果您在会话中写入内容,则会将其写入客户端上的 cookie。对于您的服务器的每个以下请求,cookie 都会发送到服务器,我假设它以某种方式连接到互联网。

    此外,cookie 和会话的大小受到限制(大约 4kb)。因此,您可能无法在会话中存储所有内容。

    问题是如果用户的答案被提交到互联网上, 它们很容易被 ETS 检测到

    这是真正的问题:

    通常,如果不想让其他人(例如 ETS)阅读您的内容,您可以限制对内容的访问。通过密码或其他方式。

    因此,请使用某种身份验证(@Rich Peck 的回答),请特别注意您的内容仅在成功身份验证后可见,不要将密码提供给 ETS,您应该没问题。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多