<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>shanghaichris</title>
    <description></description>
    <link>http://shanghaichris.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>使用TextMate进行Rails开发</title>
        <author>shanghaichris</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shanghaichris.javaeye.com">shanghaichris</a>&nbsp;
          链接：<a href="http://shanghaichris.javaeye.com/blog/170282" style="color:red;">http://shanghaichris.javaeye.com/blog/170282</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="font: normal normal normal 12px/normal STSong; margin: 0px">这些天一直在学习TextMate，正好看到里面的DemoHelp，觉得很有用，就把它简单的翻译了一下，放在这里给需要的朋友。有什么问题请指正。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">==============</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">关于<span style="font: normal normal normal 12px/normal Georgia">TextMate</span>的传说已经流传很久了，这款<span style="font: normal normal normal 12px/normal Georgia">MacOSX</span>所缺失的文字编辑器在熟练的高手手里是开发Rails的最佳工具。一起来看看怎么用TextMate开发一个简单的Blog吧。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">1、首先安装git，下载源码编译或者到这里下载package：http://metastatic.org/text/Concern/2007/09/15/new-git-package-for-os-x/</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">2、在Terminal中键入如下命令：</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">cd ~/Desktop</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">git clone git://github.com/drnic/ruby-on-rails-tmbundle.git &ldquo;Ruby on Rails.tmbundle&ldquo;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">cd &ldquo;Ruby on Rails.tmbundle&ldquo;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">git checkout --track -b two_point_ooh origin/two_point_ooh</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">git pull</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">3、双击桌面上的&ldquo;Ruby on Rails.tmbundle&ldquo;图标安装此bundle</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">这样，Ruby on Rails 2.0 的bundle就安装到TextMate里面了</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">下面可以开始开发一个新的应用了</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在终端里输入</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">rails blogcd blogmate .</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">增加一个模型</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">ruby script/generate model Post subject:string body:text</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">生成了一个新的迁移 001_create_posts.rb，包含一个方法 Create_Table</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">create_table :posts do |t|  t.string :subject  t.text :body  t.timestampsend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">Sexy Migration的支持</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px"><span style="font: normal normal normal 12px/normal STSong">把光标放在 t.text :body下面一行，输入 t. 然后按下</span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⇥</span>（<span style="font: normal normal normal 13px/normal 'Lucida Grande'">Tab</span>键），选择&ldquo;<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Create boolean column&rdquo; </span>或者按下<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">0 </span>，创建一个布尔字段，然后输入 published，如果按下Tab键没有反应，看看是否选择对了Ruby on Rails的bundle（在底下状态栏里）</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">请注意这个时候下面还有一行t. 如果需要继续输入其他字段，就可以再按下Tab键直接输入。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">我们现在不需要别的更多的字段了，就按下<span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌃</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⇧</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> K</span>（<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Control+Shift+K</span>）把这一行删除。然后保存文件<span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> S</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">然后运行迁移，可以在命令行输入</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">rake db:migrate</pre><p>&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'">或者直接在编辑器里按下</span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌃</span> |<span style="font: normal normal normal 13px/normal 'STHeiti Light'">（</span>Control+|<span style="font: normal normal normal 13px/normal 'STHeiti Light'">），选择</span>&ldquo;Migrate to Current&rdquo;<span style="font: normal normal normal 13px/normal 'STHeiti Light'">。</span></p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">Post Fixtures</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">修改一下test/fixtures/post.yml</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">published:  subject: Some article  body: A test article  published: truenonpublished:  body: Still writing this one</pre><p>&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">在Rails2.0里，fixtures不再使用id了，后面我们可以看到怎么使用foxy fixtures来自动关联。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">Public blog controller</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">创建一个控制器，可以通过命令行</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">ruby script/generate controller blog</pre><p>&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">或者直接在编辑器里按下<span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌃</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> |</span>（<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Control+|</span>），选择&ldquo;<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Call Generate Script&rdquo;</span>，再选择&ldquo;Controller&rdquo;，给它起个名字叫做blog，action里不要设置任何内容。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'; color: #000000">现在打开</span>blog_controller_test.rb<span style="font: normal normal normal 12px/normal 'STHeiti Light'">，要快速找到文件，可以按下</span><span style="font: normal normal normal 13px/normal 'Lucida Grande'; color: #000000">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000"> T</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'; color: #000000">，然后输入</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">bct</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'; color: #000000">就可以找到了。</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">可以看到，功能性的测试是非常清楚和简单的。</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'">让我们开始</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">TDD</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">吧，先删除</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="color: #223512">test_truth </span><span style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512">方法</span></p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; min-height: 16px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">然后创建一个测试来显示<span style="font: normal normal normal 12px/normal Monaco">blog</span>文章列表</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; background-color: #f0f0f0; margin: 0px"><span style="font: normal normal normal 12px/normal 'STHeiti Light'; background-color: transparent">输入</span>deftg</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">然后按下<span style="font: normal normal normal 12px/normal Monaco">Tab</span>键</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">自动生成了以下代码</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def test_should_get_action  @model = models(:fixture_name)  get :action, :id =&gt; @model.to_param  assert_response :successend</pre><p>&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">光标停留在action上，用index代替它，然后按下Tab键，光标选择了方法的第一行，删除它，然后按三次Tab键，删除<span style="font: normal normal normal 12px/normal Monaco; color: #223512">:id =&gt; @model.to_param </span><span style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512">部分。再次按下Tab键，光标跳到方法的最后一行。现在的代码应该是这样的：</span></p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def test_should_get_index  get :index  assert_response :successend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入 asg ，然后按下Tab键，然后键入posts,然后按下Tab键。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">下面，键入ass ，然后按下Tab键，输入div#posts，按下Tab键，删除余下的部分。然后连续按Tab键两次，把光标放在assert_select里面，现在代码如下</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">assert_select 'div#posts' doend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入ass，按下Tab键，键入div.post，然后按下Tab两次，键入count，取代掉text。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在再按下Tab键，键入post.size，最后一次按下Tab键，删除被选中的部分。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">好了，现在我们的测试方法完成了</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def test_should_get_index  get :index  assert_response :success  assert(posts = assigns(:posts), &ldquo;Cannot find @posts&ldquo;)  assert_select 'div#posts' do    assert_select 'div.post', :count =&gt; posts.size  endend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 12px/normal STSong; color: #000000">还有一个</span>deftp<span style="font: normal normal normal 12px/normal 'STHeiti Light'">代码片段来创建一个</span>POST<span style="font: normal normal normal 12px/normal 'STHeiti Light'">方法的测试。很容易记住的，</span>deftg<span style="font: normal normal normal 12px/normal 'STHeiti Light'">代表</span>define test get, deftp<span style="font: normal normal normal 12px/normal 'STHeiti Light'">代表</span>define test post</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; min-height: 16px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px">Controller actions</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">要导航到blog_controller.rb文件，有三种选择：</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px"><span style="font: normal normal normal 12px/normal STSong">1，按下</span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⇧</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">&darr;</span>（<span style="font: normal normal normal 13px/normal 'Lucida Grande'">Shift+option+command+</span>下箭头），然后在弹出的菜单中选择&ldquo;Controller&rdquo;，</p><p style="font: normal normal normal 13px/normal 'Lucida Grande'; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'">2，按下</span>⌥<span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span>⌘<span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span>&darr;<span style="font: normal normal normal 13px/normal 'STHeiti Light'">（</span>option+command+<span style="font: normal normal normal 13px/normal 'STHeiti Light'">下箭头），然后直接去</span>controller<span style="font: normal normal normal 13px/normal 'STHeiti Light'">文件（来回切换）</span></p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px"><span style="font: normal normal normal 13px/normal 'Lucida Grande'">3</span>，按下<span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> T</span>，然后键入bc，找到那个文件。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">增加一个index方法</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def index  @posts = Post.find_all_by_published(true)end</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 14px/normal STSong; margin: 0px">Action Views</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px"><span style="font: normal normal normal 12px/normal STSong">要创建或者导航到一个视图，可以按下</span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⇧</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">&darr;</span>（<span style="font: normal normal normal 13px/normal 'Lucida Grande'">shift+option+command+</span>下箭头），然后选择<span style="font: normal normal normal 13px/normal 'Lucida Grande'"> &ldquo;View&rdquo;</span>（就像上面那样），或者按下<span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">⌘</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'">&darr;</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'"> </span>（<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">option+command+</span>下箭头）来切换控制器的方法和对应的视图。</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'; color: #000000">因为没有对应的</span><span style="font: normal normal normal 12px/normal Monaco">app/views/blog/index*</span>文件，所以会提示要求创建一个空白视图，默认的它会猜测文件名称为<span style="font: normal normal normal 12px/normal Monaco">index.html.erb</span>，<span style="font: normal normal normal 12px/normal Monaco"> </span>因为方法的名字叫做<span style="font: normal normal normal 12px/normal Monaco">index</span>，但是当然您可以改为其他名字。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px"><span style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512">如果您得到一个提示：</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">blog_controller.rb does not have a view</span>，请注意先要保存控制器文件，然后在切换到视图。同时请注意，光标要在控制器方法的范围内，才能起作用。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">好了，我们转到刚创建的index.html.erb</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">键入div，然后按两次Tab，把id改为post，然后再按Tab，应该是这样：</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&lt;div id=&ldquo;posts&ldquo;&gt;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; min-height: 16px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&lt;/div&gt;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">在div标签中，键入for，按下Tab，生成一个for循环，在光标处替换list为@posts,按下Tab，然后键入post，替换掉item，再按下Tab，现在光标应该在for循环里面了。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">键入div，然后Tab，生成了div标签，删除id，键入class='post'，再按Tab，进入了div标签里面。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">用control+&gt;创建一个&lt;%= %&gt;, 如果再按一下control+&gt;，就会生成&lt;% %&gt;,再按一下，会生成&lt;%- -%&gt;,再按一下就会生成&lt;%# %&gt;，如此循环往复。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">键入post.body</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">实际上，我们还需要显示标题，所以在&lt;%= post.body %&gt;这一行上面（按下command+return，上箭头）,键入h3，然后按下control+&lt;，生成&lt;h3&gt;标签。键入control+&gt;，键入post.subject</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">在下面的<span class="Apple-tab-span" style="white-space: pre">	</span>&lt;% else %&gt;&lt;% end %&gt; 中间，创建一个简单的标记&lt;p&gt;&lt;/p&gt;（使用control+&lt;），键入There are no posts available to read. All y'all come back soon, yer hear.&nbsp; 呵呵，纯粹好玩儿。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">好了，我们的视图现在是这样子了：</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">&lt;div id=&ldquo;posts&ldquo;&gt;  &lt;% if !@posts.blank? %&gt;    &lt;% for post in @posts %&gt;      &lt;div class=&ldquo;post&ldquo;&gt;        &lt;h3&gt;&lt;%= post.subject %&gt;&lt;/h3&gt;        &lt;%= post.body %&gt;      &lt;/div&gt;    &lt;% end %&gt;  &lt;% else %&gt;    &lt;p&gt;There are no posts available to read. All y'all come back soon, yer hear.&lt;/p&gt;  &lt;% end %&gt;&lt;/div&gt;</pre><p>&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">现在可以运行单元测试了，应该可以通过。可以在命令行中输入：rake test:functionals &nbsp; 或者直接在编辑器里键入control+\然后选择2：<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Test Functionals</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">我们现在还不能让用户留言。</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">Foxy Fixtures</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">创建一个comment模型</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; background-color: #f0f0f0; margin: 0px">ruby script/generate model Comment body:text name:string post:references</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">请注意，这里post:references的作用和以前的post_id:integer是一样的。在生成的迁移文件中，它创建了<span style="font: normal normal normal 12px/normal Monaco; color: #223512">t.reference :post</span><span style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512">，</span></p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">下面是生成的第二个迁移文件</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">create_table :comments do |t|  t.text :body  t.string :name  t.references :post  t.timestampsend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">运行这个迁移。命令行里键入 rake db:migrate , 或直接在编辑器按下control+| 然后在弹出的菜单重选择<span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">Migrate to Current</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'">下面，我们创建几个</span>comment fixtures<span style="font: normal normal normal 13px/normal 'STHeiti Light'">，以便我们看看</span>Foxy Fixtures<span style="font: normal normal normal 13px/normal 'STHeiti Light'">怎么运行的。</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; margin: 0px"><span style="font: normal normal normal 13px/normal 'STHeiti Light'">打开</span>test/fixtures/comments.yml:</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">one:  body: MyText  name: MyString  post:two:  body: MyText  name: MyString  post:</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">字段post替代了rails1.2中post_id的位置。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">上面我们有了published和nonpublished，或许很难记住，我们有一个快捷键。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">把光标放在post: 后面，然后按下 option+Esc , 就可以选择了。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">关联</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">为了能够用到Foxy Fixtures，我们必须增加两个模型类之间的关联。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在你已经可以快速切换到模型类的文件了，（shift+option+command+下箭头）在comment.rb 模型类文件中，键入bt然后按下Tab键，键入post</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">belongs_to :post, :class_name =&gt; &ldquo;Post&ldquo;, :foreign_key =&gt; &ldquo;post_id&ldquo;</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在:class_name和:foreign_key都已经一起自动的把object改为post了，当然，您继续按下Tab键，还可以继续改。不过我们这里就不需要了，直接删除后面的就行了。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在它是这样的：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">class Comment &lt; ActiveRecord::Base  belongs_to :postend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后去看看post类，打开Post.rb</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入hm,然后Tab。 同样的我们不需要那些option，删除。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">class Post &lt; ActiveRecord::Base  has_many :commentsend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">如果您需要has_many :through ，可以键入hmt然后tab，就行了。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">最后我们测试一下。（control+\）</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">路由</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">打开路由文件routes.rb</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">修改一下：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">ActionController::Routing::Routes.draw do |map|  map.resources :posts  map.connect ':controller/:action/:id'  map.connect ':controller/:action/:id.:format'end</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">创建文章</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">从Post模型文件post.rb，您可以快速导航到同名的控制器文件，可以支持单数形式的控制器名或者复数形式的控制器名称，但是默认都是复数形式的，以更加符合REST风格。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">要创建一个PostsController，可以使用Go To...的快捷键shift+option+command+下箭头，然后选择Controller，因为没有post_controller.rb或者posts_controller.rb，所以会问您是否需要创建一个，确认后，就得到我们自己的posts_controller.rb文件了。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">注意，我们通常也可以使用脚手架来自动生成控制器文件，包括路由和测试文件。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在posts_controller里面，我们先要创建一个控制器类。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">如果posts_controller.rb里面有内容，清空全部的内容，然后键入cla，按下Tab，选择<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Create controller class</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，在光标处键入</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Posts</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，然后</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">tab</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，然后键入</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">post</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，然后</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">tab</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，最后键入</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">Post</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，然后</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">tab</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，光标回到了类的中间。</span></p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">class PostsController &lt; ApplicationController  before_filter :find_post  private  def find_post    @post = Post.find(params[:id]) if params[:id]  endend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">TDD测试PostsController</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">当前是没有一个PostsController的功能测试的，我们可以继续使用GoTo...的快捷键：shift+option+command+下箭头，然后选择Functional Test,就会创建一个控制器测试文件</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后分别为index, new, edit三个方法建立测试，使用deftg+Tab的方式。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">要建立create方法的测试，请键入deftp，然后按下Tab，键入create，然后tab，键入post，然后tab，按下delete键，再tab，再delete，再Tab，光标就转移到{}中，然后修改成下面这样：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def test_should_post_create  post :create, :post =&gt; { :subject =&gt; 'Test', :body =&gt; 'Some body', :published =&gt; '1' }  assert_response :redirectend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在assert_response这一行后面，我们可以测试我们想跳转重定向的位置。</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 12px/normal STSong; color: #000000">如果您键入art，就会创建一个：</span>assert_redirected_to :action =&gt; &ldquo;index&ldquo;&nbsp; <span style="font: normal normal normal 12px/normal 'STHeiti Light'">代码片段</span></p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">现在增加了好几个assert_redirected_to的代码片段，使用到了资源化路由( resourceful route)</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; min-height: 12px; margin: 0px">&nbsp;</p><ul style="list-style-type: disc"><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">artp &ndash; </span>assert_redirected_to model_path(@model)</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">artpp &ndash; </span>assert_redirected_to models_path</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">artnp &ndash; </span>assert_redirected_to parent_child_path(@parent, @child)</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">artnpp &ndash; </span>assert_redirected_to parent_child_path(@parent)</li></ul><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入artpp，然后按下Tab，然后键入post,这样生成的断言就会要求create动作重定向到index页面</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">最后的test_should_post_create方法应该是这样的：</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def test_should_post_create  post :create, :post =&gt; { :subject =&gt; 'Test', :body =&gt; 'Some body', :published =&gt; '1' }  assert_response :redirect  assert_redirected_to posts_pathend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后运行测试，然后可以看到这些新创建的测试都没通过</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">视图</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 12px/normal STSong; color: #000000">现在回到</span>posts_controller.rb<span style="font: normal normal normal 12px/normal 'STHeiti Light'">文件（</span>option+command+<span style="font: normal normal normal 12px/normal 'STHeiti Light'">下箭头）</span></p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">我们要创建三个新的方法：index, new, edit。新方法可以这样来创建：<span style="font: normal normal normal 13px/normal 'STHeiti Light'; color: #000000">键入</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000"> </span><span style="font: normal normal normal 12px/normal Monaco">def</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'; color: #000000">⇥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 12px/normal Monaco">index</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'; color: #000000">⇥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 12px/normal Monaco">@posts = Post.fina</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'; color: #000000">⇥</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">, </span><span style="font: normal normal normal 13px/normal 'Lucida Grande'; color: #000000">⌫</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">.</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">现在这三个方法分别需要三个视图模板来对应。</p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">把光标放在<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">index</span>方法中，呼叫出Goto...菜单（shift+option+command+下箭头），选择View，会创建一个新的index.html.erb模板，</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">让我们来创建一个表格来显示Posts吧</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入table，按下control+&lt;，生成table标签。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后在table标签中生成tbody标签</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在tbody里，我们希望可以枚举 @posts ，每一行一条记录。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">按三次control+&gt;, 创建&lt;%- -%&gt;，在里面键入 <span style="font: normal normal normal 12px/normal Monaco; color: #223512">@posts.each do |post|</span></p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; min-height: 16px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">转到下一行（command+enter），键入end, 按下Tab，生成&lt;% end -%&gt;，这样我们在这个erb模板中就有了一个ruby的代码块了。</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">在这个代码块中，生成tr和td，我们把post的标题放在这个单元格里。</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal 'STHeiti Light'; color: #223512; margin: 0px">键入 post.subject,选中，然后按下control+&gt;，生成<span style="font: normal normal normal 12px/normal Monaco">&lt;%= post.subject %&gt;</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">.</span></p><p style="font: normal normal normal 13px/normal 'Trebuchet MS'; min-height: 15px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">最后形成这样子：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">&lt;table&gt;  &lt;tbody&gt;    &lt;%- @posts.each do |post| -%&gt;      &lt;tr&gt;        &lt;td&gt;&lt;%= post.subject %&gt;&lt;/td&gt;      &lt;/tr&gt;    &lt;% end -%&gt;  &lt;/tbody&gt;&lt;/table&gt;</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">Forms</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">把光标放在Controller的new方法中，按下shift+option+command+下箭头，叫出Goto菜单，选择View，生成new.html.erb</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在新的new.html.erb文件中，键入ffe，然后tab，键入post，然后tab两次</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">有两个snippet可以生成form_for: ff和ffe，唯一的区别就是ff生成的代码没有error_messages_for那部分内容</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后我们需要为subject属性增加一个标签和文本框：</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">首先生成一个p标签（control+&lt;，然后tab），键入f. 然后tab，选择Label,把默认的改为subject，然后tab, 删除剩下的。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">接着创建一个&lt;br&gt;标签（control+entern），键入f.然后tab，选择TextField，键入subject</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在重复创建body和published两个文本域</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">请注意，published这个属性的标签最好用published yet?，你可以tab进默认的字符串替换掉。</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">最后用f. snippet增加一个submit按钮</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">启动script/server，然后访问http://localhost:3000/posts/new</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">最后的form代码如下：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">&lt;%= error_messages_for :post %&gt;&lt;% form_for @post do |f| -%&gt;  &lt;p&gt;    &lt;%= f.label :subject %&gt;&lt;br /&gt;    &lt;%= f.text_field :subject %&gt;  &lt;/p&gt;  &lt;p&gt;    &lt;%= f.label :body %&gt;&lt;br /&gt;    &lt;%= f.text_area :body %&gt;  &lt;/p&gt;  &lt;p&gt;    &lt;%= f.label :published, &ldquo;Published yet?&ldquo; %&gt;&lt;br /&gt;    &lt;%= f.check_box :published %&gt;  &lt;/p&gt;  &lt;p&gt;    &lt;%= f.submit &ldquo;Submit&ldquo; %&gt;  &lt;/p&gt;&lt;% end -%&gt;</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">值得说明的是：如果您按下control+enter生成了br标签，但不是&lt;br /&gt;，而你希望更加符合xhtml的规范，请转到TextMate的<span style="font: normal normal normal 13px/normal 'Trebuchet MS'">preferences</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，选择</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">advanced</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">标签，选中</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">&ldquo;Shell Variablees&rdquo;</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">，增加一个变量叫做</span><span style="font: normal normal normal 13px/normal 'Trebuchet MS'">TM_XHTML,</span><span style="font: normal normal normal 13px/normal 'STHeiti Light'">值是 /</span></p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">Partials</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; min-height: 13px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">刚才我们创建的这个form和edit.html.erb模板所需要的form是一模一样的，除了复制/粘帖的方法以外，我们还可以创建一个局部模板，减少不必要的重复。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">全部选中form(command+A)，然后按下control+shift+H，会出来一个对话框，我们给他一个名字叫做form，然后确定。</p><p style="font: normal normal normal 13px/normal 'STHeiti Light'; margin: 0px">可以看到自动生成了一个名叫_form.html.erb的文件，刚才的form都在这个_form.html.erb文件中，而new.html.erb的内容被一个语句代替：</p><p style="font: normal normal normal 12px/normal Monaco; color: #223512; background-color: #f0f0f0; margin: 0px">&lt;%= render :partial =&gt; 'form' %&gt;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后我们创建edit.html.erb:&nbsp; 回到控制器文件，把光标放在edit方法上，按下shift+option+command+下箭头, 就自动生成了edit.html.erb,把刚才上面的语句粘帖到空白文件中。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">Link Helpers</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在new.html.erb底下我们还想创建一个新的返回全部文章列表的链接。在post控制器，而不是在blog控制器噢。其实就是调用index方法，通过resources rout: posts_path</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">下面这些link_to是支持resources route的：</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><ul style="list-style-type: disc"><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">lip &ndash; </span>&lt;%= link_to &ldquo;link text...&ldquo;, model_path(@model) %&gt;</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">lipp &ndash; </span>&lt;%= link_to &ldquo;link text...&ldquo;, models_path %&gt;</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">linp &ndash; </span>&lt;%= link_to &ldquo;link text...&ldquo;, parent_child_path(@parent, @child) %&gt;</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">linpp &ndash; </span>&lt;%= link_to &ldquo;link text...&ldquo;, parent_child_path(@parent) %&gt;</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">lim &ndash; </span>&lt;%= link_to model.name, model_path(model) %&gt;</li></ul><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入lipp,然后tab，键入Show all posts，然后tab两次，键入post</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">(经过测试，lipp好像有些问题，不能生成相应的代码，可以在Bundle Editor里面选择Edit Snippets... ，把lipp的snippet改为：</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">${TM_TEMPLATE_START_RUBY_EXPR}link_to ${1:&ldquo;${2:link text...}&ldquo;}, ${10:model}s_path${TM_TEMPLATE_END_RUBY_EXPR}</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">这样就好了)</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">Controllers: response_to 和 redirect_to</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在我们在posts_controller.rb里面加上 create方法。先去访问文件（option+command+下箭头)</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在edit方法下面，键入def，然后tab，然后键入create，然后tab。然后在create方法中填充下面的内容</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def create  @post = Post.new(params[:post])  if @post.save  else  endend</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">把光标放在else上面，键入repp，然后tab2次。用post代替选中的文字。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">redirect_to也有很多变化</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><ul style="list-style-type: disc"><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">rep &ndash; </span>redirect_to(model_path(@model))</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">repp &ndash; </span>redirect_to(models_path)</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">renp &ndash; </span>redirect_to(parent_child_path(@parent, @child))</li><li style="font: normal normal normal 12px/normal Monaco; color: #223512; margin: 0px"><span style="font: normal normal normal 13px/normal 'Trebuchet MS'; color: #000000">renpp &ndash; </span>redirect_to(parent_child_path(@parent))</li></ul><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">在if语句条件为假的部分，我们演示一下respond_to 代码块。有两个方法生成respond_to代码块：</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">键入rest，然后tab，生成</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">respond_to do |wants|  wants.html {  }end</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">然后按两次tab，光标置入wants.html{}里面，键入ra，然后tab，然后键入new。最终代码如下：</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">respond_to do |wants|  wants.html { render :action =&gt; &ldquo;new&ldquo; }end</pre><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">另一个，可以使用&ldquo;升级&rdquo;了的快捷键（shift+command+H），可以把选中的代码转换到respond_to代码块里。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">选中if语句条件为真部分的respond_to整行（shift+command+L）然后按shift+command+H，光标停在js上，删除这一行（control+shift+K），最终代码变成：</p><p style="font: normal normal normal 12px/normal Monaco; background-color: #f0f0f0; margin: 0px">&nbsp;</p><pre name="code" class="ruby">def create  @post = Post.new(params[:post])  if @post.save    respond_to do |wants|      wants.html do        redirect_to(posts_path)      end    end  else    respond_to do |wants|      wants.html { render :action =&gt; &ldquo;new&ldquo; }    end  endend</pre><br /><p>&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">现在我们可以在http://localhost:3000/posts/new 添加新的文章，并且在http://loclahost:3000/blog 查看文章了。</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; min-height: 12px; margin: 0px">&nbsp;</p><p style="font: normal normal normal 12px/normal STSong; margin: 0px">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://shanghaichris.javaeye.com/blog/170282#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Mar 2008 19:45:22 +0800</pubDate>
        <link>http://shanghaichris.javaeye.com/blog/170282</link>
        <guid>http://shanghaichris.javaeye.com/blog/170282</guid>
      </item>
  </channel>
</rss>