ruby-on-rails - 需要解释在 Controller 的多种方法之间共享数据的最佳实践

标签 ruby-on-rails ruby ruby-on-rails-3

我正在 Rails 中创建一个文件上传数据处理应用程序。将数据提供给 rails 中的多个 Controller 的最佳实践是什么?我的 Controller 中有一个名为 FileProcessing#upload 的操作。此页面 (upload.html.erb) 允许上传和解析 csv 文件并将其存储到一个不错的旧哈希变量 @file_data 中。

我的 Controller FileProcessing#index 中有另一个方法。这个索引方法只是为了呈现页面 index.html.erb。怎么办?如何在 index 页面中显示通过 upload 操作上传的数据?这样做的最佳做法是什么?你能解释一些我必须能够做到这一点的替代方案吗?我是 ruby​​ 的新手,所以用我的例子进行详尽的解释会很棒!预先感谢您,对于像菜鸟这样的问题,我们深表歉意。 ;-)

最佳答案

首先您需要了解的是,每个 HTTP 请求都将被路由到一个精确的 Controller#action
Rails 将为每个请求实例化一个新的 Controller 对象,然后在它们所服务的请求完成后立即销毁这些实例。

这意味着来自同一客户端的两个请求,即使是并发的或后续的,也将由 Controller 的两个不同实例处理。

此外,如果您决定通过调用 redirect_to another_path停止 action 的执行,那也将是一个不同的 HTTP 请求,因为 rails 将返回浏览器 302以新路径作为重定向目标的响应。

要回答您更实际的问题,您需要:

  1. 在某处存储您的应用程序的状态(文件、上传的日期和时间、上传它的用户等)
  2. 确保 index 操作能够检索该数据。

在第 1 点,您可以使用 cookie,可以将该数据保存在数据库中并将其关联到用户等。
在第 2 点,您可以使用用户引用检索该数据,也可以将显式引用传递给路径助手,例如:

uploads_path
  # => /uploads

uploads_path(custom_parameter: "ninja-turtles", upload_id: 1337)
  # => /uploads?custom_parameter=ninja-turtles&upload_id=1337

完成后,您将可以在新操作中访问这些参数:

params[:upload_id]
  # => "1337"

请小心,因为将敏感数据作为 URL 字符串的一部分传递意味着任何人都可以尝试提供手动制作的参数。


另一方面,如果您不想使用不同的操作,您可以在 POST 上传 末尾呈现 index.html.erb 模板> 行动。
在 Rails 中,操作将默认呈现同名模板,但当然您可以自定义它。

关于ruby-on-rails - 需要解释在 Controller 的多种方法之间共享数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137429/

相关文章:

ruby-on-rails - 如何使特定 View 不继承自 application.html.erb?

ruby-on-rails - 如何检查类或模块是否已命名空间?

java - ActionCable(Rails5) 和安卓客户端

ruby-on-rails - 使用 rake db :create:all 创建 Postgres RDS

ruby-on-rails - find_or_create上有很多直通关系

ruby-on-rails - 返回最近日期的 Rails 辅助函数

ruby-on-rails - 在 Rails 中,如何将 2009-12-01 之类的日期显示为 2009 年 12 月 1 日星期一

ruby-on-rails - 设计时“在此操作中多次调用渲染和/或重定向”

ruby-on-rails - Rails:FATAL - 用户对等身份验证失败(PG::Error)

ruby-on-rails - Rails with bootstrap-generators gem 在 IE8 中的样式为零,但在 IE9 中却如此