Rails - 如何在控制器方法之间保留实例变量

时间:2011-04-04 20:09:18

标签: ruby-on-rails instance-variables

我正在学习rails,并创建一个简单的问题/答案应用程序来测试我已经介绍过的一些概念。我使用生成脚手架来创建两个模型类 - 问题和用户。

问题表由question_number(int),question_text(string)和answer_text(string)组成。

users表有一个uid(字符串),name(字符串)和current_question(int)

然后我创建了一个名为gateway的控制器。我现在正在使用该应用程序,用户可以转到主页面,将其UID作为参数传递(最终将通过登录功能传递),应用程序将通过抓取与之匹配的question_number来显示他们当前正在处理的问题用户的current_question。大。

然后我在网关控制器中创建了一个答案方法。此方法将用户键入答案并将其与数据库中的答案进行比较,并根据答案是对还是错将用户重定向到不同的页面。

我的问题 - 我在索引方法中设置实例变量来设置当前用户和当前问题 - 但这些不会持久存在我的回答方法中。这里的Rails最佳实践是什么?我:

1)通过表单将这些作为参数传递给答案方法,就像我传递答案一样(当我已经在控制器中创建实例变量时,似乎效率低下,现在将它们传回...) 2)将这些作为变量存储在会话中? 3)将它们存储在Flash中? 4)在答案方法中再次查找它们(不喜欢重复代码,2个相同信息的调用似乎很浪费)

我甚至为这个应用使用了正确的结构吗?在这种情况下你会做什么,你想要获取用户的属性(他们当前的授权问题)并多次使用它来查询数据库的另一部分(步骤1 - 获得与用户的授权问题相匹配的问题,步骤2 - 检查答案用户输入是否正确,步骤3 - 增加用户的验证问题计数器)

更多信息,@ wukerplank

没有用于会话处理的插件。基本上,我的流程是这样的:

  1. “登录”用户(此小测试应用中没有登录逻辑,所以我只是将uid作为URL中的参数传递)
  2. 网关控制器使用@question = Question.where(:question_number => @ user.current_question)获取用户当前的问题。第一次
  3. 用户显示问题文本和表单以输入答案
  4. 提交按钮调用my:answer动作并传递答案字符串
  5. 这是我喜欢再次打电话给@question的地方,但不能因为它没有坚持。所以我要么重复第2步,要么找个地方来存储我需要再次引用的数据。我假设Rails的DRY原则会建议不要重复第2步,所以我想知道在哪里/如何存储这些(以及我可能需要的其他变量)的最佳方法是 谢谢!

2 个答案:

答案 0 :(得分:3)

将它存储在会话中听起来很合适,具体取决于您想要多少安全性。

在rails3中,会话实际上存储在cookie本身中,并且大小有限。 如果变量是大对象,那么在数据库中创建一个表,只需将id存储在会话中,每次都要查找。

或者,您可以使用memcached或等效文件存储会话,然后cookie只存储会话ID。

答案 1 :(得分:0)

我可能误解了你的问题,但通常的程序是:

  • 登录用户
  • 将他的ID存储在会话中
  • 通过会话中的ID
  • ,使用来自数据库的每个请求重新加载用户
  • 在用户表中存储相关信息(测验等进展)

你是否使用插件进行会话处理(Devise,Authlogic等)?

相关问题