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:如何在会话中存储数据?的主要内容,如果未能解决你的问题,请参考以下文章