2

您能否提供一个简单的示例,因为我是 Rails 的菜鸟。

谢谢。

4

2 回答 2

2

会话是服务器和客户端之间的对话;该对话由一个或多个请求和响应组成。

Rails 为每个会话存储一组变量,以便您可以在请求之间保持每个用户的状态。要访问控制器中的会话,请使用方法session. 它的行为类似于哈希,只是它在请求之间自动持久化。如果您在一个请求期间在会话中存储了一些东西:

session[:foo] = 'foo'

然后你可以在以后的请求中取回它:

@foo = session[:foo]

会话存储最常(但不限于)用于身份验证。如果您使用的是 devise 之类的身份验证 gem,它会使用会话存储来跟踪谁已登录。

Rails(和其他 Web 服务器)中的会话存储实现为键/值存储,由键索引,通常为给定会话随机生成。服务器将该密钥存储在提供给客户端的 cookie 中;客户端的浏览器会在每个请求中返回该 cookie。服务器从 cookie 中检索该密钥并使用它来检索会话状态。Rails 会为您处理所有这些,因此您通常不必担心。

会话存储由控制器管理。视图和模型无法在没有技巧的情况下访问它。

于 2012-10-21T17:30:34.750 回答
2

会话是一种方法,您可以跨多个请求在前端保存使用操作或数据,然后将它们传递到后端。您将在控制器的后端获取数据,然后在那里使用它。这是一个很好的解释http://guides.rubyonrails.org/security.html#sessions

例如,假设您有一个论坛,用户可以在该论坛上对页面发表评论,但他们只能在登录后发表评论。因此,如果他们未登录或未注册,则当他们点击帖子时,他们将拥有登录。通常在 Rails 中,你会让他们登录或注册,它会将他们重定向到另一个页面,甚至是当前页面。问题是他们丢失了他们键入的所有数据,因此您希望能够保存该数据并将其放回 hte 页面或按照他们的要求将其保存在数据库中。例如,您的 html 中有以下内容

<%= reply_form.text_area :body %>
  ...
<% end %>

然后在您的控制器中,您将拥有

if session[:text_area]
  params["comment"] = session[:text_area]
  ....

这样您就可以按预期将会话传递给参数,控制器将获取评论并为您创建一个新的评论对象。

另一个很好的例子是购物车。如果您没有启用会话,您将无法在在线网站上购物。原因是您在购物车中放了一些东西,然后您浏览更多内容或转到页面购买该商品。每次您点击一个新页面时,它都会向服务器发送一个新请求并向您发送新数据,如果您没有在会话中保存要购买的物品,那么没有其他方法可以查看上次保存的内容请求,以便您丢失购物车数据。

于 2012-10-21T17:43:05.437 回答