`
solaz3
  • 浏览: 73120 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Rails3教程系列之五:Rails3入门(5)

阅读更多

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

 

1. 添加第二个模型

在前面的教程中,我们已经学会的使用脚手架快速搭建一个简单的应用,毕竟脚手架不能做任何事情,现在我们需要在应用中添加第二个模型了。

 

模型在rails中使用单数形式,而其相关的数据库将使用复数名称。

 

那么对于一个博客来说,评论总是少不了的,我们现在就要创建一个 Comment 模型。对于大多数的 rails 程序员来说,一般都是通过rails的生成器来生成模型,在这里我们也一样:

 

$ rails g model comment commenter:string body:text post:references

 

该命令将创建4个文件:

 

  • app/models/comment.rb – 模型
  • db/migrate/20101128142329_create_comments.rb – 迁移文件
  • test/unit/comment_test.rb and test/fixtures/comments.yml – 测试文件.
首先,我们看一下 comment.rb
class Comment < ActiveRecord::Base
  belongs_to :post
end
 初看之下,你可能会觉得它与post模型很相识,不同之处在于它多了一行 belongs_to 声明,而这将会建立它与post模型之间的关联, 那么在后面的教程中我们将详细学习。

同时,Rails还生成了迁移文件来创建相应的表:
class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post
 
      t.timestamps
    end
  end
 
  def self.down
    drop_table :comments
  end
end
 与之前的rails版本不同,这里多了一个 t.references 定义。t.references :post 将建立一个posts表的外键 post_id, 值得注意的是这里的 :post 指的模型而不是表,这点一定要搞清楚。
现在运行迁移操作把:

$ rake db:migrate

2. 关联模型
Active Record的关联让你很容易的声明模型之间的关系。对于Posts和Comments, 很明显是一对多的关系。
前面rails已经为我们声明了 belongs_to 关系,现在我们需要再声明一个 has_many 关系, 打开 post.rb 然后添加下面一行:
class Post < ActiveRecord::Base
  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
 
  has_many :comments
end
 现在双方都已经建立起一系列的关系,打个比方,假如你有一个实例变量 @post 包含一条 post,那么你可以使用 @post.comments 来检索所有该 post 中的 comment。

3. 为comments添加路由
和home控制器一样,我们需要添加一条路由,这样rails可以知道哪里可以看到评论。再次打开 routes.rb 你可以看到上次手脚架自动给posts添加的路由条目,我们编辑下该条目:
resources :posts do
  resources :comments
end
 这将使 comments 资源作为 posts 资源的嵌套资源。而这也反映出 post 与 comment 之间的关系。

4. 生成控制器
模型有了,现在你需要创建comments控制器了,同样我们使用生成器来创建该控制器:

$ rails g controller comments

与任何博客一样,我们的读者将在他们阅读文章后直接添加评论,一旦完成评论的添加,他们将跳转到post的show页面,所以,我们的CommnetsController仅需提供创建以及删除垃圾评论的方法即可。

首先,我们修改下post的show.html.erb模板使之可以创建与显示评论:
<p class="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>
  <b>Title:</b>
  <%= @post.title %>
</p>
 
<p>
  <b>Content:</b>
  <%= @post.content %>
</p>
 
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |
 这将在post的show页面中显示一个comment表单来创建评论,而这将调用CommentsController中的create方法,如下:
class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
  end
end
 你可能会发现这里要比之前的posts控制器中稍微复杂一些,这就是你之前设定嵌套的片效应。每一个评论的请求需要追踪该评论所附加的Post,所以find首先会找出该Post对象。

接下来,代码调用了关联中存在的方法,我们在这里使用create方法来创建并保存该条评论,这将自动关联到对应的post记录。

一旦我们完成了评论的保存,我们就要使用 post_path @post 把用户跳转到原来显示该post的show页面。正如我们所看到的,它调用了PostsController中的show方法来渲染show.html.erb 模板。这里我们需要显示所有关于该Post的评论,所以让我们更改下 show.html.erb 页面:
<p class="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>
  <b>Title:</b>
  <%= @post.title %>
</p>
 
<p>
  <b>Content:</b>
  <%= @post.content %>
</p>
 
<h2>Comments</h2>
<% @post.comments.each do |comment| %>
  <p>
    <b>Commenter:</b>
    <%= comment.commenter %>
  </p>
 
  <p>
    <b>Comment:</b>
    <%= comment.body %>
  </p>
<% end %>
 
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
 
<br />
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |
 现在你可以在你的博客中添加post和评论了,并且把它们显示在正确的地方。

 

分享到:
评论
5 楼 372029002 2012-07-07  
 
老师好帮我看个问题行吗。
~接触ruby跟rails 半个月了,我这按照ror的入门在学习,我这里遇到了问题。
提示我 【comments】没有,我的代码对过2遍了,没错。帮我看看吧,谢谢了!
undefined method `comments' for nil:NilClassRails.root: D:/Rubydemo/demo3

Application Trace | Framework Trace | Full Trace
app/controllers/comments_controller.rb:5:in `create'
Request
Parameters:

{"utf8"=>"✓",
"authenticity_token"=>"8IMu5tG9HDusyxAf3n1WCKYUtmRvH16CEDqt93n9+sc=",
"comment"=>{"commenter"=>"阿",
"body"=>"猜猜"},
"commit"=>"Create Comment",
"post_id"=>"7"}
4 楼 dtzq01 2011-04-17  
很感谢你的分享。
但是下面这段代码似乎有问题,会提示语法错误:
Ruby代码

    class Post < ActiveRecord::Base 
      validates :name,  :presence => true 
      validates :title, :presence => true, 
                        :length => { :minimum => 5 } 
      
      <strong>has_many :comments</strong
    end 
我用的是rails 3.0.6, ruby 1.8.7
改成:
class Post < ActiveRecord::Base
validates :name, :presence => true 
        validates :title, :presence => true, :length => {:minimum => 5}
has_many :comments
end
即可。
:)
3 楼 solaz3 2011-04-08  
85行语法错误
resources :books do
      resources :comments
   resources :users
# resources :hello
    get "users/say_hello"
   get "hello/say_hello"
# get "hello/say_time"
  # get "hello/say_greeting"
   match ':controller(/:action(/:id(.:format)))'
end
这里很乱啊
标准的ruby block写法

试试
resources :books do
  resources :comments
end
resources :users
后面的注释掉
2 楼 wj196 2011-04-01  
刚刚有打错字,请你帮忙看一下好吗?谢谢

我的routes.rb文件:(我把里面注释的部分去掉了)
Testapp::Application.routes.draw do
  get "test/say_yes"
  get "test/say_no"
  get "test/say_love"
  get "test/say_bye"
  get "leg/say_morning"
  get "leg/say_bye"
  get "leg/say_hello"
  resources :books do
      resources :comments
   resources :users
# resources :hello
    get "users/say_hello"
   get "hello/say_hello"
# get "hello/say_time"
  # get "hello/say_greeting"
   match ':controller(/:action(/:id(.:format)))'
end

1 楼 wj196 2011-04-01  
我是按照你说的步骤做的,可是不知道为什么在生成controller  comments时,出现了这个错误,我是刚刚学习rails的,不知道到底是哪里出了问题,你了帮我看一下吗?之前创建rails 工程时这个错误出现了很多次了。前面的是执行正确的

我执行的是命令: rails generate controller comments


出现的错误是:
org/jruby/RubyKernel.java:1063:in `load': E:/mytest/testapp/config/routes.rb:85: syntax error, unexpected end-of-file (SyntaxError)

from E:/mytest/testapp/config/routes.rb:235:in `load'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:225:in `load_dependency'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:596:in `new_constants_in'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:595:in `new_constants_in'
from AbstractScript.java:41:in `(root)'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:225:in `load_dependency'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:235:in `load'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/railties-3.0.5/lib/rails/application.rb:127:in `reload_routes!'
from org/jruby/RubyArray.java:1676:in `each'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/railties-3.0.5/lib/rails/application.rb:127:in `reload_routes!'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/railties-3.0.5/lib/rails/application.rb:120:in `routes_reloader'
from org/jruby/RubyProc.java:268:in `call'
from org/jruby/RubyProc.java:228:in `call'
from D:/software/jruby/jruby/jruby-1.6.0.RC2/lib/ruby/gems/1.8/gems/activesupport-3.0.5/lib/active_support/file_update_checker.rb:32:in `execute_if_updated'



谢谢!!!

相关推荐

    Rails入门教程一(翻译).pdf

    《Rails入门教程一》是针对初学者的一份详尽指南,旨在帮助读者快速掌握Ruby on Rails框架的基础知识。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    Ruby on Rails入门例子

    在"Ruby on Rails入门例子"中,我们可能会遇到以下关键概念: - **路由(Routes)**:Rails的路由系统将URL映射到特定的控制器动作,定义了应用的导航结构。在`config/routes.rb`文件中配置路由规则。 - **生成器...

    Ruby on Rails入门经典代码

    本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...

    Ruby on Rails入门经典

    在Ruby on Rails入门经典中,你将学习到以下核心知识点: 1. **Ruby语言基础**:首先,你需要了解Ruby的基础语法,包括变量、数据类型(如字符串、整数、浮点数、数组、哈希)、控制结构(如条件语句if/else,循环...

    [Rails] Rails 3 入门教程 (英文版)

    [Apress] Rails 3 入门教程 (英文版) [Apress] Beginning Rails 3 (E-Book) ☆ 出版信息:☆ [作者信息] Cloves Carneiro Jr., Rida Al Barazi [出版机构] Apress [出版日期] 2010年09月01日 [图书页数] 400页...

    Ruby on Rails入门权威经典

    总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的教程,它不仅教授了Ruby on Rails的基础知识,还提供了许多实用技巧和最佳实践,是初学者入门Rails的理想选择。通过阅读本书,读者不仅能学会...

    Ruby on Rails 入门经典教程

    通过《Ruby on Rails 入门经典教程》,无论你是编程新手还是希望转行Web开发的计算机操作者,都可以系统地掌握Ruby on Rails的核心知识,开启Web开发之旅。aybook.cn_rinumzwb1227.pdf这份文档正是这个宝贵资源的...

    rails3入门指南

    ruby on rails文档,rails3入门指南

    Ruby on Rails 3 Tutorial

    - **《Ruby on Rails 3 教程》**:由Michael Hartl编写的一本经典教材,被广泛认为是学习Rails的最佳资源之一。 - **教学方法**: - **示例驱动**:通过具体的项目示例来讲解Rails的各种功能。 - **循序渐进**:从...

    Ruby on Rails:Rails框架入门.docx

    Ruby on Rails:Rails框架入门.docx

    ruby on rails入门基础

    以上是Ruby on Rails入门的基础知识,通过学习这些,你可以开始构建自己的Web应用。对于初学者,建议跟随一个详细的教程逐步实践,结合实际案例理解Rails的工作原理。在学习过程中,不断练习和调试代码,加深对框架...

Global site tag (gtag.js) - Google Analytics