Rails:如何在会话中存储数据?

Posted

技术标签:

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

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

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

【问题讨论】:

我认为在会话中存储完整的论文不是一个好主意,您保存为论文的偏执记录并将essay_id存储在会话中。 【参考方案1】:

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

session[:answer] = "some answer"

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

session[:answer]

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

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

【讨论】:

您提供了在 rails 中与 session 交互的方式。但我不知道它是如何工作的。你能帮我解释清楚session 是如何在 Rails 中工作的吗? 阅读Rails Guides - What are sessions?和How Rails Sessions work【参考方案2】:
    Rails 将数据存储在数据库中(不必在“Internet”上) 在会话中存储大量数据是一个真的坏主意

会话

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,您应该没问题。

【讨论】:

以上是关于Rails:如何在会话中存储数据?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 中的会话如何工作?

在 Rails 的会话中存储对象

存储 HTML5 地理位置数据

Rails 最好的安全会话存储?

会话存储在 Rails 中的啥位置?

如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?