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 赞一个!