Flash—“动作”间的通信
当我们使用redirect_to()来传输控制给其它“动作”时,浏览器生成一个单独的请求
来要求那个“动作”。那个请求将通过我们应用程序的一个“控制器”对象的新实例内被处
理—在原先“动作”内设置的实例变量在被重定向“动作”内的处理代码中将不再有效。但
是有时候我们需要在这两个实例之间通信。我们可以使用叫flash 的功能做到这一点。
flash 是个临时的值暂存器。它被组织成类似于一个哈希表,并用来存储“会话”数据,
所以你可以存储与key 关联的值,并在稍后再重新取回它们。它有一个特别的属性。缺省地,
在一个请求处理期间被存储到flash 内的值在随后马上到达的请求处理中依然有效。一旦第
二个请求被处理完,这些值会被从flash 中移除。[如果你阅读flash 功能文档,你将会看到,
它谈到值只在下一个“动作”中有效。这不是很严格的:flash 在下一个请求处理结束后被
清除,而不是基于“动作”之间的。]
或许flash 最常用的用法是将一个“动作”的错误和信息字符串传递给下一个“动作”。
目的是让第一个“动作”通知一些条件,创建描述那个条件的消息,然后重定向到一个单独
的“动作”。通过在flash 中存储信息,第二个“动作”也能够访问文本消息并在“视图”
中使用它。
class BlogController
def display
@article = Article.find(params[:id])
end
def add_comment
@article = Article.find(params[:id])
comment = Comment.new(params[:comment])
@article.comments << comment
if @article.save
flash[:note] = "Thank you for your valuable comment"
else
flash[:note] = "We threw your worthless comment away"
end
redirect_to :action => 'display'
end
这个例子中,add_comment()方法以key 键:note 存储两个不同消息中的一个在flash 中。
它重定向到display()“动作”。display()“动作”似乎并不使用这个消息。继续看,我们
必须深入来查看app/views/blog 目录内的display.rhtml 中的代码。
<html>
<head>
<title>My Blog</title>
<%= stylesheet_link_tag("blog") %>
</head>
<body>
<div id="main">
<% if @flash[:note] -%>
<div id="notice"><%= @flash[:note] %></div>
<% end -%>
: : :
: : :
</div>
</body>
</html>
“层”代码中的flash 同它在“控制器”中一样好理解。在这个例子中,如果flash 包
含一个:note key 键,则我们的“层”会生成适当的<div>。
有时候也可方便地把flash 使用于传递当前“动作”内的消息到一个“模板”中。例如,
我们的display()方法可能在没有一个横向块时输出一个,以引起更多的注意。它不需要将
消息传递给下一个“动作”—它只用于当前的请求。要做到这些,它可以使用flash.now,
它更新flash 但不添加“会话”数据。
class BlogController
def display
unless flash[:note]
flash.now[:note] = "Welcome to my blog"
end
@article = Article.find(params[:id])
end
end
在flash.now 创建一个暂态的flash 条目时,flash.keep 做相反的事情,它让当的条目
逗留在其它请求循环之间。
class SillyController
def one
flash[:note] = "Hello"
flash[:error] = "Boom!"
redirect_to :action => "two"
end
def two
flash.keep(:note)
flash[:warning] = "Mewl"
redirect_to :action => "three"
end
def three
# At this point,
# flash[:note] => "Hello"
# flash[:warning] => "Mewl"
# and flash[:error] is unset
render
end
end
如果你没有传递给flash.keep 参数,所有flash 内容被保留。Flash 可以存储很多文本
信息—你可以使用它们在“动作”之间传递所有种类信息。明显地对于较长的信息你应该想
到使用“会话”(或许与你的数据库结合)来存储数据,但如果你想把参数从一个请求传递给
下一个请求,flash 还是很重要。
因为flash 数据被存储在“会话”内,所有的规则都适用于它。特别地,每个对象必须
被序列化,并且如果你存储“模型”,你需要在你的“控制器”中声明一个“模型”。
当我们使用redirect_to()来传输控制给其它“动作”时,浏览器生成一个单独的请求
来要求那个“动作”。那个请求将通过我们应用程序的一个“控制器”对象的新实例内被处
理—在原先“动作”内设置的实例变量在被重定向“动作”内的处理代码中将不再有效。但
是有时候我们需要在这两个实例之间通信。我们可以使用叫flash 的功能做到这一点。
flash 是个临时的值暂存器。它被组织成类似于一个哈希表,并用来存储“会话”数据,
所以你可以存储与key 关联的值,并在稍后再重新取回它们。它有一个特别的属性。缺省地,
在一个请求处理期间被存储到flash 内的值在随后马上到达的请求处理中依然有效。一旦第
二个请求被处理完,这些值会被从flash 中移除。[如果你阅读flash 功能文档,你将会看到,
它谈到值只在下一个“动作”中有效。这不是很严格的:flash 在下一个请求处理结束后被
清除,而不是基于“动作”之间的。]
或许flash 最常用的用法是将一个“动作”的错误和信息字符串传递给下一个“动作”。
目的是让第一个“动作”通知一些条件,创建描述那个条件的消息,然后重定向到一个单独
的“动作”。通过在flash 中存储信息,第二个“动作”也能够访问文本消息并在“视图”
中使用它。
class BlogController
def display
@article = Article.find(params[:id])
end
def add_comment
@article = Article.find(params[:id])
comment = Comment.new(params[:comment])
@article.comments << comment
if @article.save
flash[:note] = "Thank you for your valuable comment"
else
flash[:note] = "We threw your worthless comment away"
end
redirect_to :action => 'display'
end
这个例子中,add_comment()方法以key 键:note 存储两个不同消息中的一个在flash 中。
它重定向到display()“动作”。display()“动作”似乎并不使用这个消息。继续看,我们
必须深入来查看app/views/blog 目录内的display.rhtml 中的代码。
<html>
<head>
<title>My Blog</title>
<%= stylesheet_link_tag("blog") %>
</head>
<body>
<div id="main">
<% if @flash[:note] -%>
<div id="notice"><%= @flash[:note] %></div>
<% end -%>
: : :
: : :
</div>
</body>
</html>
“层”代码中的flash 同它在“控制器”中一样好理解。在这个例子中,如果flash 包
含一个:note key 键,则我们的“层”会生成适当的<div>。
有时候也可方便地把flash 使用于传递当前“动作”内的消息到一个“模板”中。例如,
我们的display()方法可能在没有一个横向块时输出一个,以引起更多的注意。它不需要将
消息传递给下一个“动作”—它只用于当前的请求。要做到这些,它可以使用flash.now,
它更新flash 但不添加“会话”数据。
class BlogController
def display
unless flash[:note]
flash.now[:note] = "Welcome to my blog"
end
@article = Article.find(params[:id])
end
end
在flash.now 创建一个暂态的flash 条目时,flash.keep 做相反的事情,它让当的条目
逗留在其它请求循环之间。
class SillyController
def one
flash[:note] = "Hello"
flash[:error] = "Boom!"
redirect_to :action => "two"
end
def two
flash.keep(:note)
flash[:warning] = "Mewl"
redirect_to :action => "three"
end
def three
# At this point,
# flash[:note] => "Hello"
# flash[:warning] => "Mewl"
# and flash[:error] is unset
render
end
end
如果你没有传递给flash.keep 参数,所有flash 内容被保留。Flash 可以存储很多文本
信息—你可以使用它们在“动作”之间传递所有种类信息。明显地对于较长的信息你应该想
到使用“会话”(或许与你的数据库结合)来存储数据,但如果你想把参数从一个请求传递给
下一个请求,flash 还是很重要。
因为flash 数据被存储在“会话”内,所有的规则都适用于它。特别地,每个对象必须
被序列化,并且如果你存储“模型”,你需要在你的“控制器”中声明一个“模型”。
本文介绍Rails框架中如何利用Flash机制实现动作间的数据通信,包括如何存储及读取信息,以及Flash的一些高级用法。
1645

被折叠的 条评论
为什么被折叠?



