需要解释在控制器的多种方法之间共享数据的最佳实践

时间:2014-03-03 01:58:34

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

我正在rails中创建文件上传数据处理应用。将数据提供给轨道中的多个控制器的最佳做法是什么?我的控制器中有一个名为FileProcessing#upload的动作。此页面(upload.html.erb)允许上传和解析csv文件并将其存储到一个漂亮的旧哈希变量@file_data中。

我的控制器FileProcessing#index中有另一种方法。此索引方法仅用于呈现页面index.html.erb。怎么办?如何通过upload页面中的index操作显示上传的数据?这样做的最佳做法是什么?你能解释一下我必须做的一些替代方案吗?我对ruby很新,所以用我的例子做一个彻底的解释会很棒!提前谢谢你,抱歉这样的菜鸟问题。 ; - )

2 个答案:

答案 0 :(得分:2)

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

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

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

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

  1. 在某处存储应用程序的状态(文件,上传的日期和时间,上传的用户等)
  2. 确保index操作具有检索该数据的方法。
  3. 在第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字符串的一部分传递意味着任何人都可以尝试提供手动制作的参数。


    另一方面,如果您不想使用其他操作,则只需在index.html.erb操作结束时呈现POST upload模板。
    在Rails中,操作将默认呈现相同名称的模板,但当然您可以自定义该模板。

答案 1 :(得分:0)

控制器及其操作通过将数据持久保存到某个存储(通常是数据库),然后通过控制器的实例变量@variable_name使这些数据可用来“共享”Rails中的数据。

可能你需要做的是:

  1. 通过carrierwavepaperclip
  2. 将您的文件上传到S3
  3. 在应用程序数据库中存储对该文件的引用
  4. 通过从数据库中提取ref并放入实例var来访问索引操作/视图中的引用。