Ruby on Rails中MVC结构的数据传递解析

2019-09-25 09:44:13于丽

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. 文章评论显示效果

2015422173352088.jpg (372×289)

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. 页面上显示用户列表

2015422173413196.jpg (427×168)

从实现的效果上看,flash、cookie 及 session 都能够完成视图间的数据传递。但 flash 一般用于简单的提示消息,而 cookie 及 session 则常见于用户信息管理。

结语

本文结合实际的演示程序,首先介绍了 Rails 3 的 MVC 架构,然后逐步对控制器与视图、控制器与模型以及视图内部的关系进行了介绍,对数据传递方法于技巧进行了具体分析。