我正在 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以新路径作为重定向目标的响应。
要回答您更实际的问题,您需要:
- 在某处存储您的应用程序的状态(文件、上传的日期和时间、上传它的用户等)
- 确保
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/