首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

Rails3课程系列之三:Rails3入门(3)

2012-12-24 
Rails3教程系列之三:Rails3入门(3)文章出处:http://edgeguides.rubyonrails.org/getting_started.html?1.

Rails3教程系列之三:Rails3入门(3)

文章出处:http://edgeguides.rubyonrails.org/getting_started.html

?

1. 列出所有Posts

要开始查看功能的最简单的地方应该是列举所有记录的代码了。现在我们打开 app/controllers/post_controller.rb, 看到 index 方法

?

def index    @posts = Post.all    respond_to do |format|      format.html # index.html.erb      format.xml  { render :xml => @posts }    endend

?

?实际上在这里有2个地方与rails2不同了,第一是查询的方式,以前我们可能会这样写

@posts = Post.find(:all)

,那么现在这种方式完全改变了,现在多出了一个重要的类 ActivaRecord::Relation 在里面分装了大量的数据库相关的操作。第二呢,我们不用写成上面的这种代码了:

respond_to :html,:js,:xmldef index    @posts = Post.all    respond_with @postsend

?这样很容易解释,相应的格式请求使用相应的模板,比如我们访问 http://localhost:3000/posts.xml 那么我们会得到一个xml格式的posts, 是不是很REST? 这里我们加了一个:js, 这为后面教程中使用ujs做下铺垫,那么具体的用法我们会在后面教程中给大家一一说明。

?

Rails把所有该动作中的实例变量传递给相应的视图,这里是 app/views/posts/index.html.erb :

<h1>Listing posts</h1> <table>  <tr>    <th>Name</th>    <th>Title</th>    <th>Content</th>    <th></th>    <th></th>    <th></th>  </tr> <% @posts.each do |post| %>  <tr>    <td><%= post.name %></td>    <td><%= post.title %></td>    <td><%= post.content %></td>    <td><%= link_to 'Show', post %></td>    <td><%= link_to 'Edit', edit_post_path(post) %></td>    <td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>  </tr><% end %></table> <br /> <%= link_to 'New post', new_post_path %>
?

该视图遍历@posts数组来显示内容以及链接,一些要注意的地方:

link_to 绑定了特定的记录操作edit_post_path 与 new_post_path 实际上在你设定 routes.rb 中相关resources的时候就已经给你生成的帮助器(好像一共有7个),你可以在控制器中看到不同的这种帮助器。

?

这里还有一点值得注意:在先前版本的rails中你可能需要使用 <%= h post.name %> 来实现HTML转义,那么在3.0中,默认就已经是转义的了,如果你需要获得未转义的HTML,你需要这样写 <%= raw post.name %> (raw我想大家很容易理解, java中也经常有这种警告)

?

2. 自定义布局

当rails渲染视图给浏览器时,它会把视图放置到布局内然后在输出。在先前的rails版本中,rails g scaffold 命令会自动创建控制器指定的布局,比如 app/views/layouts/posts.html.erb, 那么在3.0中 app/views/layouts/application.html.erb 作用与所有控制器。打开你的编辑器,把该布局修改如下:

<!DOCTYPE html><html><head>  <title>Blog</title>  <%= stylesheet_link_tag :all %>  <%= javascript_include_tag :defaults %>  <%= csrf_meta_tag %></head><body style="background: #EEEEEE;"> <%= yield %> </body></html>
?现在你刷新你的页面你会发现背景变成了灰色。

?

3. 创建新的Post

创建一个新的Post将调用两个动作,第一个是new,它将初始化一个Post对象。

def new    @post = Post.new    respond_with @postend

?(同样我们在这里改为更简单的方式, 是不是很DRY?)

在 new.html.erb 视图中显示一个空的Post给用户:

<h1>New post</h1><%= render 'form' %><%= link_to 'Back', posts_path %>

?<%= render 'form' %> 是我们第一次介绍Rails的局部模板。局部模板实际上也是一个视图文件,只是该文件可以被多个视图重复引用。在这种情况下,form可用于创建,更新post,然后我们可以看到 app/views/posts/_form.html.erb:

<%= form_for(@post) do |f| %>  <% if @post.errors.any? %>    <div id="error_explanation">      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>      <ul>      <% @post.errors.full_messages.each do |msg| %>        <li><%= msg %></li>      <% end %>      </ul>    </div>  <% end %>  <div name="code">def create    @post = Post.new(params[:post])    if @post.save      respond_with @post, :notice => 'Post was successfully created.'    else      render :action => 'new'    endend

?create方法根据传递的post参数初始化了一个post对象,保存成功以后放回用户请求的相应格式。然后把用户重定向到show页面并且设置一条成功创建的信息反馈给用户。

?

如果post由于验证失败等原因未能成功保存,那么控制器将把用户返回到new页面,并显示相应的错误信息。

?

“Post was successfully created.”保存在rails的flash哈希内,我们可以在视图层用<%=flash[:notice]%>查看(那么现在我们只需要 =notice 就可以了)

?

太晚了,明天见。

1 楼 fantaxy025025 2011-09-24   赞一个!
正在学习,谢楼主辛勤总结!

期待能有新篇章,讲解平时心得~

热点排行