我正在rails中创建文件上传数据处理应用。将数据提供给轨道中的多个控制器的最佳做法是什么?我的控制器中有一个名为FileProcessing#upload
的动作。此页面(upload.html.erb)允许上传和解析csv文件并将其存储到一个漂亮的旧哈希变量@file_data
中。
我的控制器FileProcessing#index
中有另一种方法。此索引方法仅用于呈现页面index.html.erb
。怎么办?如何通过upload
页面中的index
操作显示上传的数据?这样做的最佳做法是什么?你能解释一下我必须做的一些替代方案吗?我对ruby很新,所以用我的例子做一个彻底的解释会很棒!提前谢谢你,抱歉这样的菜鸟问题。 ; - )
答案 0 :(得分:2)
您需要了解的第一件事是每个HTTP请求都将路由到精确的Controller#action
。
Rails将为每个请求实例化一个新的Controller
对象,然后在它们所服务的请求完成后立即销毁这些实例。
这意味着来自同一客户端的两个请求(即使是并发或后续)将由Controller
的两个不同实例处理。
此外,如果您决定通过调用action
暂停执行redirect_to another_path
,那么这也将是一个不同的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字符串的一部分传递意味着任何人都可以尝试提供手动制作的参数。
另一方面,如果您不想使用其他操作,则只需在index.html.erb
操作结束时呈现POST upload
模板。
在Rails中,操作将默认呈现相同名称的模板,但当然您可以自定义该模板。
答案 1 :(得分:0)
控制器及其操作通过将数据持久保存到某个存储(通常是数据库),然后通过控制器的实例变量@variable_name
使这些数据可用来“共享”Rails中的数据。
可能你需要做的是: