Rails 提供非常简便的 Cookie 访问方法。为了提示用户使用相同的用户名发表评论,此处采用 Cookie 来保存用户最近一次发表评论时使用的用户名。如清单 8 所示,通过 cookies[:name] 来读取或者保存用户名。
清单 8. 创建评论的控制器代码片段
class CommentsController < ApplicationController def create @last_name = cookies[:name] @name = params[:comment][:user] unless @name == @last_name cookies[:last_name] = @last_name cookies[:name] = @name else cookies[:last_name] = nil end end end
在文章控制器中,如清单 9 所示,可以将 Cookies 保存的数据读取出来,使用非常方便。评论页面的显示效果如图 8 所示。
清单 9. 通过 cookie 操作数据
def show @article = Article.find(params[:id]) @last_name = cookies[:last_name] unless @last_name == nil @name = cookies[:name] end
图 8. 文章评论显示效果

Rails 应用程序经常使用 session 来实现多个请求之间的数据传递,session 对象在控制器和视图中都可以使用。现在我们新增加一个 session 对象,用于保存用户使用过的姓名列表。在 CommentsController 中,session 对象的操作如清单 10 所示。
清单 10. 通过 session 操作数据的代码片段
@names = session[:name] if @names @names = [] end if @name @names << @name end session[:names] = @names
在视图中,添加显示用户名列表的代码,如清单 11 所示。页面最终显示效果如图 9 所示。
清单 11. 视图读取用户名列表的代码
<% if @names %> <p>The names you have used:</p> <ul> <% @names.each do |name| %> <li><%=h name %></li> <% end %> </ul> <% end %>
图 9. 页面上显示用户列表

从实现的效果上看,flash、cookie 及 session 都能够完成视图间的数据传递。但 flash 一般用于简单的提示消息,而 cookie 及 session 则常见于用户信息管理。
结语
本文结合实际的演示程序,首先介绍了 Rails 3 的 MVC 架构,然后逐步对控制器与视图、控制器与模型以及视图内部的关系进行了介绍,对数据传递方法于技巧进行了具体分析。










