1

在 asp.net mvc 中有一个方法叫做TempData用于保存临时数据。在 Sinatra 中是否有类似的东西?

更新:它变成了 TempData

4

1 回答 1

2

这篇关于 ViewBag、ViewData 和 TempData 之间差异的文章指出:

所有三个对象都可用作视图和控制器的属性。

ViewData 是一个字典对象,您可以将数据放入其中,然后视图可以使用该对象。ViewData 是 ViewDataDictionary 类的派生类,因此您可以通过熟悉的“键/值”语法进行访问。

ViewBag 对象是 ViewData 对象的包装器,允许您为 ViewBag 创建动态属性。

Sinatra 不使用 MVC 模型,它使用 Page 控制器模型。首先,这意味着 .Net 中所需的许多脚手架在 Sinatra 中没有意义。此外,因为我们使用的是 Ruby 而不是 C#(或其他),所以我们再次错过了许多所需的样板文件。

最后,在 MVC 到 Page 控制器的说法中,“控制器”基本上是一条路由。所以:

get "/" do
  # stuff…
  haml :index
end

是一个控制器。如果我们正在寻找一个对路由和视图都可用的字典对象(因此,某种哈希),那么根据文档,我们就在请求范围内。当您在请求范围内时,您可以同时使用:

  • 路由中定义的实例变量。
  • 助手(包括settings对象)
  • 路由中定义的本地变量显式传递给视图。

所以这会起作用:

get "/" do
  @viewbag = {a: 1}
  haml :index
end

%p= @viewbag[:a]
%p
  This will display 1

或这个:

helpers do
  def viewbag
    @viewbag ||= {}
  end
end

get "/" do
  viewbag.store :a, 1
  haml :index
end

%p= viewbag[:a]
%p
  This will display 1

或这个:

get "/" do
  viewbag = {:a => 1}
  haml :index, :locals => {viewbag: viewbag}
end

%p= viewbag[:a]
%p
  This will display 1

(不要被上面不同的语法和Hash对象的使用弄糊涂了)

最后,ViewBag 是动态的。好吧,Ruby Hash 也是如此,因为整个语言更加动态。

但是,我感觉你问这个问题是在寻找其他东西,因为你已经陈述了一个实现而不是一个目标。如果您想获得更好的答案,请告诉人们您想要实现什么以及您尝试过什么,而不仅仅是您认为应该如何完成。

于 2013-02-13T16:21:01.600 回答