`
shanghaichris
  • 浏览: 4634 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用TextMate进行Rails开发

阅读更多

这些天一直在学习TextMate,正好看到里面的DemoHelp,觉得很有用,就把它简单的翻译了一下,放在这里给需要的朋友。有什么问题请指正。

 

==============

 

关于TextMate的传说已经流传很久了,这款MacOSX所缺失的文字编辑器在熟练的高手手里是开发Rails的最佳工具。一起来看看怎么用TextMate开发一个简单的Blog吧。

 

1、首先安装git,下载源码编译或者到这里下载package:http://metastatic.org/text/Concern/2007/09/15/new-git-package-for-os-x/

2、在Terminal中键入如下命令:

cd ~/Desktop

git clone git://github.com/drnic/ruby-on-rails-tmbundle.git “Ruby on Rails.tmbundle“

cd “Ruby on Rails.tmbundle“

git checkout --track -b two_point_ooh origin/two_point_ooh

git pull

3、双击桌面上的“Ruby on Rails.tmbundle“图标安装此bundle

这样,Ruby on Rails 2.0 的bundle就安装到TextMate里面了

 

下面可以开始开发一个新的应用了

 

在终端里输入

 

rails blogcd blogmate .

 

 

增加一个模型

 

ruby script/generate model Post subject:string body:text

 

 

生成了一个新的迁移 001_create_posts.rb,包含一个方法 Create_Table

 

create_table :posts do |t|  t.string :subject  t.text :body  t.timestampsend

 

 

Sexy Migration的支持

 

把光标放在 t.text :body下面一行,输入 t. 然后按下Tab键),选择“Create boolean column” 或者按下0 ,创建一个布尔字段,然后输入 published,如果按下Tab键没有反应,看看是否选择对了Ruby on Rails的bundle(在底下状态栏里)

 

请注意这个时候下面还有一行t. 如果需要继续输入其他字段,就可以再按下Tab键直接输入。

 

我们现在不需要别的更多的字段了,就按下 KControl+Shift+K)把这一行删除。然后保存文件 S

 

然后运行迁移,可以在命令行输入

 

 

rake db:migrate

 

 

或者直接在编辑器里按下 |Control+|),选择“Migrate to Current”

 

Post Fixtures

 

修改一下test/fixtures/post.yml

 

 

published:  subject: Some article  body: A test article  published: truenonpublished:  body: Still writing this one

 

 

在Rails2.0里,fixtures不再使用id了,后面我们可以看到怎么使用foxy fixtures来自动关联。

 

 

Public blog controller

 

创建一个控制器,可以通过命令行

 

ruby script/generate controller blog

 

 

或者直接在编辑器里按下 |Control+|),选择“Call Generate Script”,再选择“Controller”,给它起个名字叫做blog,action里不要设置任何内容。

 

现在打开blog_controller_test.rb,要快速找到文件,可以按下 T,然后输入bct就可以找到了。

 

可以看到,功能性的测试是非常清楚和简单的。

 

让我们开始TDD吧,先删除 test_truth 方法

 

然后创建一个测试来显示blog文章列表

输入deftg

然后按下Tab

自动生成了以下代码

 

def test_should_get_action  @model = models(:fixture_name)  get :action, :id => @model.to_param  assert_response :successend

 

 

光标停留在action上,用index代替它,然后按下Tab键,光标选择了方法的第一行,删除它,然后按三次Tab键,删除:id => @model.to_param 部分。再次按下Tab键,光标跳到方法的最后一行。现在的代码应该是这样的:

 

 

def test_should_get_index  get :index  assert_response :successend

 

 

键入 asg ,然后按下Tab键,然后键入posts,然后按下Tab键。

 

下面,键入ass ,然后按下Tab键,输入div#posts,按下Tab键,删除余下的部分。然后连续按Tab键两次,把光标放在assert_select里面,现在代码如下

 

 

assert_select 'div#posts' doend

 

 

键入ass,按下Tab键,键入div.post,然后按下Tab两次,键入count,取代掉text。

现在再按下Tab键,键入post.size,最后一次按下Tab键,删除被选中的部分。

 

好了,现在我们的测试方法完成了

 

 

def test_should_get_index  get :index  assert_response :success  assert(posts = assigns(:posts), “Cannot find @posts“)  assert_select 'div#posts' do    assert_select 'div.post', :count => posts.size  endend

 

 

还有一个deftp代码片段来创建一个POST方法的测试。很容易记住的,deftg代表define test get, deftp代表define test post

 

Controller actions

要导航到blog_controller.rb文件,有三种选择:

1,按下 Shift+option+command+下箭头),然后在弹出的菜单中选择“Controller”,

2,按下 option+command+下箭头),然后直接去controller文件(来回切换)

3,按下 T,然后键入bc,找到那个文件。

 

增加一个index方法

 

def index  @posts = Post.find_all_by_published(true)end

 

 

Action Views

 

要创建或者导航到一个视图,可以按下 shift+option+command+下箭头),然后选择 “View”(就像上面那样),或者按下 option+command+下箭头)来切换控制器的方法和对应的视图。

因为没有对应的app/views/blog/index*文件,所以会提示要求创建一个空白视图,默认的它会猜测文件名称为index.html.erb 因为方法的名字叫做index,但是当然您可以改为其他名字。

如果您得到一个提示:blog_controller.rb does not have a view,请注意先要保存控制器文件,然后在切换到视图。同时请注意,光标要在控制器方法的范围内,才能起作用。

 

好了,我们转到刚创建的index.html.erb

 

键入div,然后按两次Tab,把id改为post,然后再按Tab,应该是这样:

 

<div id=“posts“>

 

</div>

 

在div标签中,键入for,按下Tab,生成一个for循环,在光标处替换list为@posts,按下Tab,然后键入post,替换掉item,再按下Tab,现在光标应该在for循环里面了。

键入div,然后Tab,生成了div标签,删除id,键入class='post',再按Tab,进入了div标签里面。

 

用control+>创建一个<%= %>, 如果再按一下control+>,就会生成<% %>,再按一下,会生成<%- -%>,再按一下就会生成<%# %>,如此循环往复。

 

键入post.body

 

实际上,我们还需要显示标题,所以在<%= post.body %>这一行上面(按下command+return,上箭头),键入h3,然后按下control+<,生成<h3>标签。键入control+>,键入post.subject

 

在下面的 <% else %><% end %> 中间,创建一个简单的标记<p></p>(使用control+<),键入There are no posts available to read. All y'all come back soon, yer hear.  呵呵,纯粹好玩儿。

 

好了,我们的视图现在是这样子了:

 

 

<div id=“posts“>  <% if !@posts.blank? %>    <% for post in @posts %>      <div class=“post“>        <h3><%= post.subject %></h3>        <%= post.body %>      </div>    <% end %>  <% else %>    <p>There are no posts available to read. All y'all come back soon, yer hear.</p>  <% end %></div>

 

 

现在可以运行单元测试了,应该可以通过。可以在命令行中输入:rake test:functionals   或者直接在编辑器里键入control+\然后选择2:Test Functionals

 

我们现在还不能让用户留言。

 

 

Foxy Fixtures

 

创建一个comment模型

ruby script/generate model Comment body:text name:string post:references

 

请注意,这里post:references的作用和以前的post_id:integer是一样的。在生成的迁移文件中,它创建了t.reference :post

下面是生成的第二个迁移文件

 

create_table :comments do |t|  t.text :body  t.string :name  t.references :post  t.timestampsend

 

 

运行这个迁移。命令行里键入 rake db:migrate , 或直接在编辑器按下control+| 然后在弹出的菜单重选择Migrate to Current

 

下面,我们创建几个comment fixtures,以便我们看看Foxy Fixtures怎么运行的。

打开test/fixtures/comments.yml:

 

 

one:  body: MyText  name: MyString  post:two:  body: MyText  name: MyString  post:

 

 

字段post替代了rails1.2中post_id的位置。

上面我们有了published和nonpublished,或许很难记住,我们有一个快捷键。

把光标放在post: 后面,然后按下 option+Esc , 就可以选择了。

 

关联

 

为了能够用到Foxy Fixtures,我们必须增加两个模型类之间的关联。

现在你已经可以快速切换到模型类的文件了,(shift+option+command+下箭头)在comment.rb 模型类文件中,键入bt然后按下Tab键,键入post

 

belongs_to :post, :class_name => “Post“, :foreign_key => “post_id“

 

 

现在:class_name和:foreign_key都已经一起自动的把object改为post了,当然,您继续按下Tab键,还可以继续改。不过我们这里就不需要了,直接删除后面的就行了。

 

现在它是这样的:

 

class Comment < ActiveRecord::Base  belongs_to :postend

 

 

然后去看看post类,打开Post.rb

 

键入hm,然后Tab。 同样的我们不需要那些option,删除。

 

 

class Post < ActiveRecord::Base  has_many :commentsend

 

如果您需要has_many :through ,可以键入hmt然后tab,就行了。

 

最后我们测试一下。(control+\)

 

 

 

路由

 

打开路由文件routes.rb

 

修改一下:

 

ActionController::Routing::Routes.draw do |map|  map.resources :posts  map.connect ':controller/:action/:id'  map.connect ':controller/:action/:id.:format'end

 

 

 

 

创建文章

 

从Post模型文件post.rb,您可以快速导航到同名的控制器文件,可以支持单数形式的控制器名或者复数形式的控制器名称,但是默认都是复数形式的,以更加符合REST风格。

 

要创建一个PostsController,可以使用Go To...的快捷键shift+option+command+下箭头,然后选择Controller,因为没有post_controller.rb或者posts_controller.rb,所以会问您是否需要创建一个,确认后,就得到我们自己的posts_controller.rb文件了。

 

注意,我们通常也可以使用脚手架来自动生成控制器文件,包括路由和测试文件。

 

在posts_controller里面,我们先要创建一个控制器类。

如果posts_controller.rb里面有内容,清空全部的内容,然后键入cla,按下Tab,选择Create controller class,在光标处键入Posts,然后tab,然后键入post,然后tab,最后键入Post,然后tab,光标回到了类的中间。

 

 

class PostsController < ApplicationController  before_filter :find_post  private  def find_post    @post = Post.find(params[:id]) if params[:id]  endend

 

 

TDD测试PostsController

 

当前是没有一个PostsController的功能测试的,我们可以继续使用GoTo...的快捷键:shift+option+command+下箭头,然后选择Functional Test,就会创建一个控制器测试文件

 

然后分别为index, new, edit三个方法建立测试,使用deftg+Tab的方式。

 

要建立create方法的测试,请键入deftp,然后按下Tab,键入create,然后tab,键入post,然后tab,按下delete键,再tab,再delete,再Tab,光标就转移到{}中,然后修改成下面这样:

 

def test_should_post_create  post :create, :post => { :subject => 'Test', :body => 'Some body', :published => '1' }  assert_response :redirectend

 

 

在assert_response这一行后面,我们可以测试我们想跳转重定向的位置。

如果您键入art,就会创建一个:assert_redirected_to :action => “index“  代码片段

现在增加了好几个assert_redirected_to的代码片段,使用到了资源化路由( resourceful route)

 

  • artp – assert_redirected_to model_path(@model)
  • artpp – assert_redirected_to models_path
  • artnp – assert_redirected_to parent_child_path(@parent, @child)
  • artnpp – assert_redirected_to parent_child_path(@parent)

 

键入artpp,然后按下Tab,然后键入post,这样生成的断言就会要求create动作重定向到index页面

 

最后的test_should_post_create方法应该是这样的:

 

 

def test_should_post_create  post :create, :post => { :subject => 'Test', :body => 'Some body', :published => '1' }  assert_response :redirect  assert_redirected_to posts_pathend

 

 

然后运行测试,然后可以看到这些新创建的测试都没通过

 

 

视图

 

 

现在回到posts_controller.rb文件(option+command+下箭头)

我们要创建三个新的方法:index, new, edit。新方法可以这样来创建:键入 def, , index, , @posts = Post.fina, , .

 

现在这三个方法分别需要三个视图模板来对应。

 

把光标放在index方法中,呼叫出Goto...菜单(shift+option+command+下箭头),选择View,会创建一个新的index.html.erb模板,

 

让我们来创建一个表格来显示Posts吧

 

键入table,按下control+<,生成table标签。

然后在table标签中生成tbody标签

 

在tbody里,我们希望可以枚举 @posts ,每一行一条记录。

 

按三次control+>, 创建<%- -%>,在里面键入 @posts.each do |post|

 

转到下一行(command+enter),键入end, 按下Tab,生成<% end -%>,这样我们在这个erb模板中就有了一个ruby的代码块了。

 

在这个代码块中,生成tr和td,我们把post的标题放在这个单元格里。

 

键入 post.subject,选中,然后按下control+>,生成<%= post.subject %>.

 

最后形成这样子:

 

<table>  <tbody>    <%- @posts.each do |post| -%>      <tr>        <td><%= post.subject %></td>      </tr>    <% end -%>  </tbody></table>

 

 

 

Forms

 

把光标放在Controller的new方法中,按下shift+option+command+下箭头,叫出Goto菜单,选择View,生成new.html.erb

 

在新的new.html.erb文件中,键入ffe,然后tab,键入post,然后tab两次

 

有两个snippet可以生成form_for: ff和ffe,唯一的区别就是ff生成的代码没有error_messages_for那部分内容

 

然后我们需要为subject属性增加一个标签和文本框:

 

首先生成一个p标签(control+<,然后tab),键入f. 然后tab,选择Label,把默认的改为subject,然后tab, 删除剩下的。

接着创建一个<br>标签(control+entern),键入f.然后tab,选择TextField,键入subject

 

现在重复创建body和published两个文本域

 

请注意,published这个属性的标签最好用published yet?,你可以tab进默认的字符串替换掉。

最后用f. snippet增加一个submit按钮

 

启动script/server,然后访问http://localhost:3000/posts/new

 

最后的form代码如下:

 

<%= error_messages_for :post %><% form_for @post do |f| -%>  <p>    <%= f.label :subject %><br />    <%= f.text_field :subject %>  </p>  <p>    <%= f.label :body %><br />    <%= f.text_area :body %>  </p>  <p>    <%= f.label :published, “Published yet?“ %><br />    <%= f.check_box :published %>  </p>  <p>    <%= f.submit “Submit“ %>  </p><% end -%>

 

 

值得说明的是:如果您按下control+enter生成了br标签,但不是<br />,而你希望更加符合xhtml的规范,请转到TextMate的preferences,选择advanced标签,选中“Shell Variablees”,增加一个变量叫做TM_XHTML,值是 /

 

 

Partials

 

刚才我们创建的这个form和edit.html.erb模板所需要的form是一模一样的,除了复制/粘帖的方法以外,我们还可以创建一个局部模板,减少不必要的重复。

全部选中form(command+A),然后按下control+shift+H,会出来一个对话框,我们给他一个名字叫做form,然后确定。

可以看到自动生成了一个名叫_form.html.erb的文件,刚才的form都在这个_form.html.erb文件中,而new.html.erb的内容被一个语句代替:

<%= render :partial => 'form' %>

 

然后我们创建edit.html.erb:  回到控制器文件,把光标放在edit方法上,按下shift+option+command+下箭头, 就自动生成了edit.html.erb,把刚才上面的语句粘帖到空白文件中。

 

 

 

Link Helpers

 

在new.html.erb底下我们还想创建一个新的返回全部文章列表的链接。在post控制器,而不是在blog控制器噢。其实就是调用index方法,通过resources rout: posts_path

 

下面这些link_to是支持resources route的:

 

  • lip – <%= link_to “link text...“, model_path(@model) %>
  • lipp – <%= link_to “link text...“, models_path %>
  • linp – <%= link_to “link text...“, parent_child_path(@parent, @child) %>
  • linpp – <%= link_to “link text...“, parent_child_path(@parent) %>
  • lim – <%= link_to model.name, model_path(model) %>

 

 

键入lipp,然后tab,键入Show all posts,然后tab两次,键入post

 

(经过测试,lipp好像有些问题,不能生成相应的代码,可以在Bundle Editor里面选择Edit Snippets... ,把lipp的snippet改为:

${TM_TEMPLATE_START_RUBY_EXPR}link_to ${1:“${2:link text...}“}, ${10:model}s_path${TM_TEMPLATE_END_RUBY_EXPR}

 

这样就好了)

 

Controllers: response_to 和 redirect_to

 

现在我们在posts_controller.rb里面加上 create方法。先去访问文件(option+command+下箭头)

 

在edit方法下面,键入def,然后tab,然后键入create,然后tab。然后在create方法中填充下面的内容

 

 

def create  @post = Post.new(params[:post])  if @post.save  else  endend

 

把光标放在else上面,键入repp,然后tab2次。用post代替选中的文字。

 

redirect_to也有很多变化

 

  • rep – redirect_to(model_path(@model))
  • repp – redirect_to(models_path)
  • renp – redirect_to(parent_child_path(@parent, @child))
  • renpp – redirect_to(parent_child_path(@parent))

 

 

在if语句条件为假的部分,我们演示一下respond_to 代码块。有两个方法生成respond_to代码块:

 

键入rest,然后tab,生成

 

 

respond_to do |wants|  wants.html {  }end

 

 

然后按两次tab,光标置入wants.html{}里面,键入ra,然后tab,然后键入new。最终代码如下:

 

 

respond_to do |wants|  wants.html { render :action => “new“ }end

 

 

另一个,可以使用“升级”了的快捷键(shift+command+H),可以把选中的代码转换到respond_to代码块里。

 

选中if语句条件为真部分的respond_to整行(shift+command+L)然后按shift+command+H,光标停在js上,删除这一行(control+shift+K),最终代码变成:

 

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 => “new“ }    end  endend

 

现在我们可以在http://localhost:3000/posts/new 添加新的文章,并且在http://loclahost:3000/blog 查看文章了。

 

 

 

分享到:
评论
16 楼 xhanxhanxhan 2009-01-15  
o 原来安了个老版本的rails bundle 。更新后就有了。谢谢
15 楼 xhanxhanxhan 2009-01-14  
这篇文章的原文在ruby on rails bundle的帮助里,在TextMate里面打开rails项目的一个rb文件,使用快捷键Control+H,然后选择2,就可以看到这篇文章了。最新的ror bundle更新于上个月底,还是很具有参考价值的,对于如何快速使用TextMate进行rails开发是一个不错的教程。

这个我按了没用。。
14 楼 Omnibus 2009-01-13  
samsam 写道
买不起macbook啊~


Mac mini也可以吧。
13 楼 samsam 2009-01-12  
买不起macbook啊~
12 楼 robbin 2009-01-11  
正好要用TextMate,这篇文章确实很棒!
11 楼 xhanxhanxhan 2009-01-11  
谢谢分享。
10 楼 carlosbdw 2008-06-24  
其实用什么编辑器都没关系,自己熟悉就好。
9 楼 rjbj 2008-06-23  
windows下的“TextMate”=>“etexteditor”
8 楼 rubyonrailscn.org 2008-05-11  
textmate有一个功能特别好用,在Textmate中 “Help”》“Enhanced use in terminal” > "create symbol"

然后在 terminal 中就可以使用 “mate . ”来打开当前项目

然后可以些一个 alaise
alias ett='mate app config lib db public test vendor/plugins &'

然后再“ett .”就可以打开只包含代码的项目
7 楼 Tin 2008-03-26  
太酷啦!谢谢翻译。Textmate有一本pragmatic programmer的书,也不错。但是这个Rails bundle的更贴近实际项目。
6 楼 t0uch 2008-03-24  
很不错,我这样的textmate新手可以学习一下了
5 楼 shanghaichris 2008-03-24  
lw223 写道
TextMate只能在苹果机子下用吧


是的,TextMate是苹果下最顺手的Text Editor
4 楼 lw223 2008-03-24  
TextMate只能在苹果机子下用吧
3 楼 trekker 2008-03-21  
刚来JE看到这样的好贴 谢谢楼主
2 楼 shanghaichris 2008-03-11  
这篇文章的原文在ruby on rails bundle的帮助里,在TextMate里面打开rails项目的一个rb文件,使用快捷键Control+H,然后选择2,就可以看到这篇文章了。最新的ror bundle更新于上个月底,还是很具有参考价值的,对于如何快速使用TextMate进行rails开发是一个不错的教程。

不过还有一些没完成。不是特别完整。但是基本的快捷键都包含在里面了。
1 楼 shanghaichris 2008-03-11  
<p style=''>还有一些迁移工作</p><p style=''> </p><p style=''>我们还有一些附加工作,</p><p style=''>把comments表的name列改名为author</p><p style=''>在comments表中增加一个author_url字段</p><p style=''>在comments表中的post_id字段增加一个索引</p><p style=''> </p><p style=''>让我们尝试在一个迁移文件中做这些事情。</p><p style=''>启动快速迁移(shift+control+M),给我们的迁移起个名字叫做ModifyComments,自动生成了003_Modify_comments.rb并打开,光标放在了mtab后面,删除它,键入mcol,然后tab,选择<span style=''>Rename / Rename Column</span><span style=''> (3)</span><span style=''>,键入</span><span style=''>comments</span><span style=''> </span><span style=''>⇥</span><span style=''> </span><span style=''>name</span><span style=''> </span><span style=''>⇥</span><span style=''> </span><span style=''>author</span><span style=''> </span><span style=''>⇥</span><span style=''> </span><span style=''>↩</span><span style=''>.</span></p><p style=''>同样我们再次键入mcol,然后tab,选择<span style=''>Add / Remove Column</span><span style=''> (1)</span>,键入<span style=''>comments</span><span style=''>⇥author_url</span>,然后<span style=''>⇥</span>两次。</p><p style=''>现在键入mind,然后<span style=''>⇥</span>,选择<span style=''>Choose </span><span style=''>Add / Remove Index</span><span style=''> </span>(<span style=''>1</span>),键入<span style=''>comments</span><span style=''>⇥post_id.  </span></p><p style=''>最终的代码如下:</p><p style=''> </p><p style=''>class ModifyComments &lt; ActiveRecord::Migration</p><p style=''>  def self.up</p><p style=''>    rename_column :comments, :name, :author</p><p style=''>    add_column :comments, :author_url, :string</p><p style=''>    add_index :comments, :post_id</p><p style=''>  end</p><p style=''> </p><p style=''>  def self.down</p><p style=''>    remove_index :comments, :post_id</p><p style=''>    remove_column :comments, :author_url</p><p style=''>    rename_column :comments, :author, :name</p><p style=''>  end</p><p style=''>end</p><p style=''> </p><p style=''>请注意,down方法的顺序是和up方法的顺序相反的。</p><p style=''>保存并执行这个迁移</p><p style=''> </p><p style=''>要记住修改comments的fixture文件。先打开文件(command+T,键入cy,回车),把name字段改名为author字段,并在每一节增加author_url,然后测试,应该都顺利通过。</p><p style=''> </p><p style=''>此外,我们希望当一篇文章发表时我们可以被通知到,为了做到这一点,我们需要做以下的修改:</p><p style=''>当文章发布时,有一个时间日期published date可以跟踪;</p><p style=''>移除published这个字段,因为是否已经发布我们可以看published date。</p><p style=''> </p><p style=''><span style=''>开始快速迁移(shift+control+M),起个名字叫做 </span>AddPublishedAtForPosts<span style=''>,</span> <span style=''>一个新的迁移文件</span>004_add_published_at_for_posts.rb,<span style=''>光标还是在</span>mtab<span style=''>后面,一样,我们把</span>mtab<span style=''>删除,键入</span>mcol<span style=''>,然后</span>tab<span style=''>,在弹出来的菜单上选择</span>Add / Remove Column<span style=''> (1), </span><span style=''>键入</span>posts<span style=''> </span><span style=''>⇥</span><span style=''> </span>published_at<span style=''> </span><span style=''>⇥</span><span style=''> </span>datetime<span style=''> </span><span style=''>⇥</span><span style=''> </span><span style=''>和</span><span style=''>enter</span><span style=''>。</span></p><p style=''> </p><p style=''><span style=''>再次键入</span><span style=''>mcol</span><span style=''>,</span><span style=''>tab</span><span style=''>,然后选择</span>Remove / Add Column<span style=''>(</span>5<span style=''>),键入</span>posts<span style=''> </span><span style=''>⇥</span><span style=''> </span>published<span style=''>,然后</span>tab<span style=''>两次。</span></p><p style=''>最终代码如下:</p><p style=''>class AddPublishedAtForPosts &lt; ActiveRecord::Migration</p><p style=''>  def self.up</p><p style=''>    add_column :posts, :published_at, :datetime</p><p style=''>    remove_column :posts, :published</p><p style=''>  end</p><p style=''> </p><p style=''>  def self.down</p><p style=''>    add_column :posts, :published, :boolean</p><p style=''>    remove_column :posts, :published_at</p><p style=''>  end</p><p style=''>end</p><p style=''> </p><p style=''>Remove/Add Column命令自动在down方法中决定published字段为布尔字段,这取决于当前数据库db/schema.rb文件的状态。</p><p style=''> </p><p style=''>然后保存并执行迁移。</p><p style=''> </p><p style=''> </p><p style=''> </p><p style=''><span style='color: #000000;'>现在我们要修改posts fixture文件。选择posts.yml文件(command+T, 键入pyml,选择posts.yml)。用published_at: 2008-01-01代替</span><span style=''>published: true</span><span style=''>。</span><span style=''> </span><span style=''>修改</span><span style=''>posts</span><span style=''>功能测试,首先先打开测试文件( shift+option+command+下箭头,选择Go to functional Test),用</span><span style=''>:published_at =&gt; Date.new(2008, 1, 1) </span><span style=''>替换</span><span style=''> :published =&gt; '1'.</span></p><p style=''> </p><p style=''>修改<span style=''>post</span>模型,打开<span style=''>posts.rb</span>(<span style=''>shift+option+command+</span>下箭头,选择Go to Model), 黏贴下面的代码:</p><p style=''>class Post &lt; ActiveRecord::Base</p><p style=''>  has_many :comments</p><p style=''> </p><p style=''>  def published</p><p style=''>    !self.published_at.nil?</p><p style=''>  end</p><p style=''> </p><p style=''>  def published=(publish)</p><p style=''>    if publish</p><p style=''>      self.published_at = DateTime.now if self.published_at.nil?</p><p style=''>    else</p><p style=''>      self.published_at = nil</p><p style=''>    end</p><p style=''>  end</p><p style=''>end</p><p style=''> </p><p style=''> </p><p style=''><span style=''>修改blog_controller.rb,用</span>Post.find(:all, :conditions =&gt; “published_at IS NOT NULL“)<span style=''>代替</span>Post.find_all_by_published(true)<span style=''>。然后测试运行,所有的测试都应该通过。</span></p><div><span class='Apple-style-span' style='font-family: &apos;STHeiti Light&apos;; color: #223512;'><br/></span></div>

相关推荐

    TextMate 2.0.23 fix 著名的文本编辑器

    包括DHH在内的Rails核心开发者一直都使用TextMate进行开发,原因就是他们主要都在使用Mac OS系统,并且TextMate具备出色的界面、强大的宏定义、以及可下载和编辑的宏定义包(bundles),这些都帮助开发者将编码的...

    textmate教程

    此外,Ruby on Rails开发者和其他编程爱好者也会发现TextMate在处理编程任务方面的强大能力。 #### 六、结语 总之,TextMate是一款极具潜力和实用价值的编辑器,无论是对于初学者还是资深开发者来说,都是一个值得...

    ruby on rails 101

    引用自Nathan Torkington的话:“使用Ruby on Rails就像观看功夫电影一样,看似弱小的新手框架却能够用各种创造性的方式打败众多强大的对手。”这句话生动地描述了Ruby on Rails的独特之处以及它在Web开发领域的影响...

    Head.First.Rails中文版.2011.12

    2. **Rails环境搭建**:学习如何安装Ruby、Rails以及相关的开发工具,如Git、SQLite、TextMate或Sublime Text等,创建第一个“Hello, World!”应用。 3. **Rails生成器**:Rails提供了许多命令行工具,如`rails ...

    Textmate.Power.Editing.for.the.Mac.pdf

    好用的textmate,ruby on rails开发必备!

    Pragmatic.Textmate.Power.Editing.for.the.Mac.Feb.2007.pdf

    对于Mac用户来说,TextMate无疑是一款强大的编辑工具,尤其是在Ruby on Rails开发中发挥着重要作用。本文将基于《TextMate: Power Editing for the Mac》这本书的内容,深入探讨TextMate的各项特性及其对开发者的...

    ruby on rails

    6. **开发工具**:如TextMate、Sublime Text、VS Code或Atom等文本编辑器,它们具有强大的Rails插件,可以提高开发效率。此外,Git用于版本控制,终端用于命令行操作。 7. **集成开发环境(IDE)**:如RubyMine,...

    ruby 1.8.7 rails 2.3.4

    标签 "源码 工具" 暗示了可能涉及源代码管理和开发工具的使用,比如 Git 用于版本控制,或者是 IDE(集成开发环境)如 TextMate 或 NetBeans 用于 Ruby on Rails 开发。 在压缩包中的 "libmySQL.dll" 文件,这通常...

    Textmate 1.58 r1498 破解版

    the missing editor on mac os x.ruby on rails 最好的开发环境 密码www.macx.cn

    mac snow leopard安装ruby

    在 Mac OS X Snow Leopard(版本 10.6)系统下安装 Ruby 和进行 Ruby on Rails 的开发,是许多开发者特别是初学者可能会遇到的需求之一。尽管 Snow Leopard 已经是一个相对较老的操作系统版本,但仍然有不少用户由于...

    learn-rails:学习 Ruby on Rails Daniel Kehoe 的教程 · 版本 2.1.1 · 2014 年 10 月 22 日

    1. **Rails安装与环境配置**:包括Ruby环境的搭建、Rails框架的安装以及开发工具如Git、TextMate或VSCode的配置。 2. **创建第一个Rails应用**:通过`rails new`命令快速生成一个新的Rails项目结构,了解其目录布局...

    ruby安装工具

    Ruby是一种强大的动态编程语言,广泛应用于Web开发,尤其是与Rails框架结合使用时,可以快速构建高效、可维护的Web应用程序。RailsInstaller是专为简化Ruby on Rails环境搭建而设计的一款工具,尤其适合初学者和...

    Ruby及开发工具(一个script的程序语言)

    RubyGems包含了大量的开源库,如Web框架Rails、测试工具Rspec、自动化工具Capistrano等,这些库覆盖了从Web开发到系统管理的各个领域。 Ruby的开发工具有很多,比如: 1. TextMate和Sublime Text:轻量级的文本编辑...

    Web开发文档

    - **Ruby on Rails**:Ruby on Rails是基于Ruby的Web开发框架,其文档详细介绍了MVC架构和各种开发工具。 2. **前端手册**: - **CSS**:CSS参考手册在MDN(Mozilla Developer Network)上,包含所有CSS选择器、...

    railscasts-atom-theme:来自原始 Railscasts TextMate 主题的端口

    【railscasts-atom-theme】是一个专门为 Atom 编辑器设计的主题,灵感来源于经典的 RailsCasts TextMate 主题。RailsCasts 是一个由 Ryan Bates 创建的著名 Ruby on Rails 教程系列,其清晰的讲解风格深受开发者喜爱...

    Ruby入门培训ppt/pdf及代码

    Ruby开发者常用的工具有TextMate、Sublime Text、VS Code等编辑器,以及Git进行版本控制,Rake用于构建任务,RSpec进行测试驱动开发。 **10. 学习资源** 除了本培训资料,还有众多在线资源可供学习,如Ruby官方网站...

    Ruby_stack

    Rails 的“约定优于配置”(Convention Over Configuration)理念降低了开发过程中的复杂性,让开发者能更专注于业务逻辑。 在 Ruby Stack 中,数据库管理通常使用 ActiveRecord,这是 Rails 框架的一部分,它提供...

    training_curriculum2

    Ruby on Rails(简称Rails)是一个基于MVC(模型-视图-控制器)架构的Web开发框架,它简化了数据库交互、路由配置、模板渲染等任务,极大地提高了开发效率。Rails遵循DRY(Don't Repeat Yourself)原则,提倡代码...

Global site tag (gtag.js) - Google Analytics