首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

剖析 Rails 3 MVC 中的数据传递(2)

剖析 Rails 3 MVC 中的数据传递(2)

控制器与视图间的数据传递方法技巧打开视图文件夹,找到用于实现文章列表的源文件 $rorails/demoBlog/app/views/articles/index.html.erb,可以看到清单 1 所示代码。这段代码对变量 @articles 迭代,显示所有文章列表的属性值。
清单 1. 视图 index.html.erb 代码片段
1
2
3
4
5
6
7
8
9
10
11
<% @articles.each do |article| %>
<tr>
   <td><%= article.title %></td>
   <td><%= article.keywords %></td>
   <td><%= article.content %></td>
   <td><%= link_to 'Show', article %></td>
   <td><%= link_to 'Edit', edit_article_path(article) %></td>
   <td><%= link_to 'Destroy', article, :confirm =>
   'Are you sure?', :method => :delete %></td>
</tr>
<% end %>




让初学者困惑不已的是,此处的变量 @articles 来自何处呢?为了解决这个问题,打开 article 控制器的源文件 $rorails/demoblog/app/controllers/articles_controller.rb,找到与 index.html.erb 对应的 index 方法,可以看到变量 @articles,如清单 2 所示。视图中的 @articles 变量正是由控制器生成赋值,然后传递给视图的,并且这个传递过程对开发人员而言是透明的。换句话说,视图可以直接使用对应控制器中对应方法的变量。
清单 2. 控制器中获取数据的代码片段
1
2
3
4
5
6
7
def index
  @articles = Article.all
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @articles }
  end
end




用户打开 http://localhost:3000/articles/new 发表新文章,控制器将通过 @article = Article.new,基于 Article 模型创建一个值为空的数据,然后传输给 new.html.erb 视图,显示效果如图 3 所示。用户在这个空的页面上填写数据,点击“Create Article”创建文章。文章创建成功,返回文章创建成功的提示信息和新创建文章的内容,如图 4 所示。这里看似一个简单的过程,实际上包含了将数据从表单传递到控制器,进而传递到模型完成存储的过程。
图 3. 新创建文章图 4. 文章创建成功渲染视图的代码位于 _form.html.erb(被 new.html.erb 调用)。用户点击提交后,Rails 将根据路由规则跳转到控制器的 create 方法。过程的确简单,但是用户填写到表单的数据是如何传递给控制器的呢?
控制器的 create 方法如下清单 3 所示。为了创建新的 article 对象,create 方法将从 params 中读取数据 :article 参数。这里的 params 是哈希表,它是 Rails 里最重要的传递参数之一,包含浏览器请求传递的数据。正是这个 params 将数据从客户端表单传递到控制器。以此处为例,新建的文章表单数据(包括 Title,Keywords,Content)将被封装到 article 对象,通过 params 传递到控制器。
清单 3. 控制器的 create 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def create
  @article = Article.new(params[:article])
  respond_to do |format|
    if @article.save
      format.html {
    redirect_to(@article, :notice => 'Article was successfully created.') }
      format.xml  {
    render :xml => @article, :status => :created, :location => @article }
    else
      format.html {
    render :action => "new" }
      format.xml  {
    render :xml => @article.errors, :status => :unprocessable_entity }
    end
  end
end




Rails 应用程序可以用两种方法的把数据传给 params,进而由控制器的某个方法获取。一种是将用户输入到 HTML 表单的数据封装到 HTTP 请求,通过 POST 方法将数据传给控制器的 params。上文采用的就是这种方法,将 new.html.erb 视图的表单数据通过 POST 方法提交。另外一种方法就是通过把数据作为 URL 的一部分,位于 URL 中 ? 之后,通常称为 URL 查询字符串参数。Rails 并没有对这两种方法传递的数据做出区分,控制器都能够以前文述及的方法从 params 中获取数据。以 URL:http://127.0.0.1:3000/articles?keywords%5b%5d=Hello&amp;keywords%5b%5d=Test& keywords%5b%5d=Article 为例,params[:keywords] 将存储 [“Hello”, “Test”, “Article”]。
返回列表