我正在学习 Rails,并创建一个简单的问答应用程序来测试我所了解的一些概念。我使用生成脚手架创建两个模型类 - 问题和用户。
问题表由question_number(int)、question_text(string)和answer_text(string)组成。
users 表有 uid(字符串)、name(字符串)和 current_question(int)
然后我创建了一个名为 gateway 的 Controller 。我的应用程序现在正在运行,用户可以进入主页,将其 UID 作为参数传递(最终将通过登录函数传递),并且应用程序将通过抓取与用户的当前问题。太棒了。
然后我在网关 Controller 中创建了一个应答方法。此方法将用户在表单中输入的答案与数据库中的答案进行比较,根据答案是对还是错将用户重定向到不同的页面。
我的问题 - 我在索引方法中设置实例变量来设置当前用户和当前问题 - 但这些不会持续到我的答案方法中。 Rails 的最佳实践是什么?我是:
1)通过表单将这些作为参数传递给答案方法,就像我传递答案一样(当我已经在 Controller 中创建了实例变量,现在将它们传递回来时,这似乎效率低下......) 2)将它们存储为 session 中的变量? 3)将这些存储在Flash中? 4)只需在答案方法中再次查找它们(不喜欢重复代码,并且两次调用相同信息似乎很浪费)
我是否为这个应用程序使用了正确的结构?在这种情况下,您想要获取用户的属性(他们当前的授权问题)并多次使用它来查询数据库的另一部分(步骤 1 - 获取与用户的授权问题匹配的问题,步骤 2 -检查用户输入的答案是否正确,第 3 步 - 增加用户的身份验证问题计数器)
更多信息,@wukerplank
没有用于 session 处理的插件。基本上,我的流程是这样的:
- “登录”用户(这个小测试应用程序中没有登录逻辑,因此我只是将 uid 作为 URL 中的参数传递)
- 网关 Controller 通过 @question = Question.where(:question_number => @user.current_question).first 获取用户当前的问题
- 用户会看到问题文本和输入答案的表单
- “提交”按钮调用我的 :answer 操作并传递答案字符串
- 在这里,我很想再次调用@question,但不能,因为它没有被持久化。所以我要么必须重复步骤2,要么找到一个地方来存储我需要再次引用的数据。我假设 Rails 的 DRY 原则建议不要重复步骤 2,所以我想知道存储这些(以及我可能需要的其他变量)的最佳方法在哪里/如何 谢谢!
最佳答案
听起来将其存储在 session 中是合适的,具体取决于您想要的安全程度。
在rails3中, session 实际上存储在cookie本身中,并且大小有限。 如果变量是大对象,则在数据库中创建一个表,并将 id 存储在 session 中并每次查找它。
或者,您可以使用 memcached 或等效工具来存储 session ,然后 cookie 只存储 session ID。
关于ruby-on-rails - Rails - 如何在 Controller 方法之间保留实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543741/