`

ruby on rails入门教程之post构建七

 
阅读更多

1. 重构

现在, 我们博客的文章和评论都可以工作了, 但是如果我们看下 app/views/posts/show.html.erb 模板, 你会发现其代码又长又笨, 还记得Rails的信条么? DRY!(不要做重复的事, Dont Repeat Yourself)

现在我们使用局部模板来清理下这些代码吧.

首先我们制作一个comment模板来显示一条文章下的所有评论. 创建 app/views/comments/_comment.erb :

  1. < p >   
  2.   < b > Commenter: </ b >   
  3.   < %= comment.commenter % >   
  4. </ p >   
  5.    
  6. < p >   
  7.   < b > Comment: </ b >   
  8.   < %= comment.body % >   
  9. </ p >   

然后修改 posts下面的show.html.erb模板:

  1. < p   class = "notice" > < %= notice % > </ p >   
  2.    
  3. < p >   
  4.   < b > Name: </ b >   
  5.   < %= @post.name % >   
  6. </ p >   
  7.    
  8. < p >   
  9.   < b > Title: </ b >   
  10.   < %= @post.title % >   
  11. </ p >   
  12.    
  13. < p >   
  14.   < b > Content: </ b >   
  15.   < %= @post.content % >   
  16. </ p >   
  17.    
  18. < h2 > Comments </ h2 >   
  19. < %= render @post.comments % >   
  20.    
  21. < h2 > Add a comment: </ h2 >   
  22. < %= form_for([@post, @post.comments.build]) do |f| % >   
  23.   < div   class = "field" >   
  24.     < %= f.label :commenter % > < br   />   
  25.     < %= f.text_field :commenter % >   
  26.   </ div >   
  27.   < div   class = "field" >   
  28.     < %= f.label :body % > < br   />   
  29.     < %= f.text_area :body % >   
  30.   </ div >   
  31.   < div   class = "actions" >   
  32.     < %= f.submit % >   
  33.   </ div >   
  34. < % end % >   
  35.    
  36. < br   />   
  37.    
  38. < %= link_to 'Edit Post', edit_post_path(@post) % >  |  
  39. < %= link_to 'Back to Posts', posts_path % >  |  

这将为每条评论渲染 app/views/comments/下面的_comment.erb局部模板, 因为传入 render 方法的参数是一个集合 (<%= render @post.comments %>), rails会自动判断参数是否是集合, 如果是, 将遍历集合同时输出局部模板 (在这里, _comment.erb局部模板的变量名称为 comment, 然后comments集合的每个元素分配给该comment变量)

请想想 form_for [@post, @post.comments.build] 方法生成表单的action为: posts/:id/comment, 那么对于REST路由, 我们在后面将会深入了解.

同样, 我们把创建评论部分也移到局部模板中去, 创建文件 app/views/comments/_form.erb:

  1. < %= form_for([@post, @post.comments.build]) do |f| % >   
  2.   < div   class = "field" >   
  3.     < %= f.label :commenter % >   
  4.     < %= f.text_field :commenter % >   
  5.   </ div >   
  6.   < div   class = "field" >   
  7.     < %= f.label :body % >   
  8.     < %= f.text_area :body % >   
  9.   </ div >   
  10.   < div   class = "actions" >   
  11.     < %= f.submit % >   
  12.   </ div >   
  13. < % end % >   

最后的show.html.erb为这个样子:

  1. < p   class = "notice" > < %= notice % > </ p >   
  2.    
  3. < p >   
  4.   < b > Name: </ b >   
  5.   < %= @post.name % >   
  6. </ p >   
  7.    
  8. < p >   
  9.   < b > Title: </ b >   
  10.   < %= @post.title % >   
  11. </ p >   
  12.    
  13. < p >   
  14.   < b > Content: </ b >   
  15.   < %= @post.content % >   
  16. </ p >   
  17.    
  18. < h2 > Comments </ h2 >   
  19. < %= render @post.comments % >   
  20.    
  21. < h2 > Add a comment: </ h2 >   
  22. < %= render "comments/form" % >   
  23.    
  24. < br   />   
  25.    
  26. < %= link_to 'Edit Post', edit_post_path(@post) % >  |  
  27. < %= link_to 'Back to Posts', posts_path % >  |  

  第二个局部模板就比较简单了, 没有变量的赋值, 仅仅引用了comments下的_form.erb模板, 通过"/", rails知道你渲染的是comments文件夹下的_form模板.

再次说明一点的是: @post 作用于任何该视图下的局部模板, 因为它是一个实例变量.

2. 删除评论

博客中另一个重要特性是可以删除垃圾评论, 要实现该功能, 我们需要在每条评论下建立一个链接, 并实现CommentController下面的destroy动作.

所以首先, 我们先在_comment.erb模板下添加一条删除链接:

  1. < p >   
  2.   < b > Commenter: </ b >   
  3.   < %= comment.commenter % >   
  4. </ p >   
  5.    
  6. < p >   
  7.   < b > Comment: </ b >   
  8.   < %= comment.body % >   
  9. </ p >   
  10.    
  11. < p >   
  12.   < %= link_to 'Destroy Comment', [comment.post, comment],  
  13.                :confirm  = >  'Are you sure?',  
  14.                :method  = >  :delete % >   
  15. </ p >   

同样也请留意下 link_to 生成的url: posts/:id/comments/:id, 以及产生一个delete请求(注意不是get, 想想如果可以通过get来删除数据是不是很糟糕? 一般来说对于查询数据我们使用get请求, 对于操作数据使用post请求, 所以对于一个搜索功能来说, 即使是表单提交, 那么我们也应该把表单的method设为get)

接下来我们实现CommentsController下的destroy方法(怎么会调用该方法? 记住这是一个REST)

  1. def  destroy  
  2.   @post  = Post.find(params[ :post_id ])  
  3.   @comment  =  @post .comments.find(params[ :id ])  
  4.   @comment .destroy  
  5.   redirect_to(post_path(@post ))  
  6. end   

destroy方法首先找到该篇文章, 然后在@post.comments集合内锁定需要删除的评论, 删除之后跳转到该文章地址.

3. 删除关联对象

如果你删除一篇文章, 那么相关的评论也一并删除. 否则评论还将继续留在数据库中占用空间. Rails同样允许你使用依赖选项来激活. 修改Post模型:

  1. class  Post < ActiveRecord::Base  
  2.   validates :name ,   :presence  =>  true   
  3.   validates :title :presence  =>  true ,  
  4.                     :length  => {  :minimum  => 5 }  
  5.   has_many :comments :dependent  =>  :destroy   
  6. end   

:dependent => :destroy 告诉rails当删除一条post时, 相关的comments将调用destroy方法一并删除, 如果设置为 :delete_all 那么关联对象将被删除而不调用 它 们的 destroy 方法, 如果设置为 :nullify, 所有关联对象的外键将被设为 null 而不调用他们的 save 回调; 如果设置为 :restrict 那么该对象在有关联对象存在的时候无法被删除. (注意一点的是 :dependent 在使用 :through 选项时将被忽略)

4. 安全

现在我们要发布博客里, 可以我们发现所有人都可以添加 删除 修改文章和评论.

那么rails提供了一个非常简单的HTTP认证, 那么我们需要在全局控制器内实现它:

app/controllers/application_controller.rb

  1. class  ApplicationController < ActionController::Base  
  2.   protect_from_forgery  
  3.    
  4.   private  
  5.    
  6.   def  authenticate  
  7.     authenticate_or_request_with_http_basic do  |user_name, password|  
  8.       user_name == 'admin'  && password ==  'password'   
  9.     end   
  10.   end   
  11.    
  12. end   

然后我们需要在PostsController阻止未认证用户的一些动作的访问, 那么在这里我们可以使用 before_filter 过滤器. 该方法将在每个动作执行前运行, 除非一些通过 :except 设置的方法:

  1. class  PostsController < ApplicationController  
  2.    
  3.   before_filter :authenticate :except  => [ :index :show ]  
  4.   ...  
  5. end   

同样的, 我们只允许认证用户可以删除评论:

  1. class  CommentsController < ApplicationController  
  2.    
  3.   before_filter :authenticate :only  =>  :destroy   
  4.   ...  
  5. end   

现在如果你创建post, 你将被要求输入用户名和密码.

Good Luck!

 

来自: http://blog.csdn.net/emerald0106/article/details/7078923

分享到:
评论

相关推荐

    Ruby on Rails入门例子

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

    ruby_on_rails 源代码上

    Ruby on Rails拥有庞大的开发者社区,提供了丰富的教程、插件和库。Stack Overflow、GitHub、RailsGuides和RailsCasts等资源对初学者和高级开发者都非常有帮助。 以上只是Ruby on Rails的部分基础知识,实际开发中...

    基于Ruby On Rails的在线购书系统

    《基于Ruby On Rails的在线购书系统》是一个深入探讨如何利用Ruby on Rails框架构建电子商务平台的项目。Ruby on Rails(RoR)是一个开源的Web应用框架,它遵循MVC(模型-视图-控制器)架构模式,以Ruby编程语言为...

    Ruby on rails blog (博客程序)

    Ruby on Rails 是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,使得开发者可以高效地构建功能丰富的Web应用程序。在这个“Ruby on Rails博客程序”中,我们将深入探讨如何在...

    Ruby on Rails轻松使用

    Ruby on Rails,简称RoR,是一款基于Ruby编程语言的开源Web开发框架,它遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率,同时保持代码的简洁和可读性。RoR的核心理念是“Don't Repeat Yourself”(DRY)...

    ruby on rails 2.1 what is new (CN)

    ### Ruby on Rails 2.1 新特性详解...以上就是Ruby on Rails 2.1版本的一些主要新特性和改进之处。这些更新不仅提升了开发效率,还增强了应用的功能性和稳定性,对于正在使用Rails进行开发的团队来说是非常值得升级的。

    ruby on rails blog(博客)制作

    通过这个Ruby on Rails博客制作的例子,你不仅学会了如何构建一个基本的Web应用,还对Rails的MVC架构、数据库操作、路由设计、表单处理、测试和部署有了深入的理解。这是一个很好的起点,随着你对Rails的深入学习,...

    ruby on rails API

    Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web应用开发。API(Application Programming Interface)是Rails提供的一种允许...

    基于ruby on rails 的简单blog

    这个简单的blog项目是初学者了解Rails的好起点,通过实践,可以掌握Rails的基本用法,进一步深入学习数据库操作、模板引擎、路由、控制器以及测试等方面的知识,为成为Ruby on Rails开发大师打下坚实基础。

    lina, An amazing RESTful API provider based on Ruby on Rails( Not maintained ).zip

    “lina, An amazing RESTful API provider based on Ruby on Rails( Not maintained ).zip” 这个标题提到了一个名为“lina”的项目,它是一个基于Ruby on Rails构建的RESTful API服务提供商。RESTful API是Web服务...

    ruby on rails 实例1

    Ruby on Rails,简称RoR,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。RoR强调“DRY”(Don't Repeat Yourself)原则和“Convention ...

    使用Ruby on Rails快速开发web应用的教程实例

    Ruby on Rails 是一个使用Ruby语言编写的开源Web应用框架,其设计宗旨是使得开发Web应用更为快速和简洁。它基于著名的模型-视图-控制器(MVC)架构模式,旨在以更少的代码实现更多功能,提高开发效率。Ruby on Rails...

    ruby 1.8.7 rails 2.3.4

    Ruby 是一种面向对象的、动态类型的编程语言,而 Rails 是一个基于 MVC(模型-视图-控制器)架构的 Web 开发框架,它极大地简化了 Web 应用程序的构建过程。 在 Ruby 1.8.7 版本中,一些关键特性包括: 1. 全局变量...

    Building.Dynamic.Web.2.0.Websites.with.Ruby.on.Rails

    《构建动态Web 2..0网站:使用Ruby on Rails》不仅是一本介绍Ruby on Rails基础知识的书籍,更是一部深入探讨Web 2.0时代下如何利用这一强大框架构建高效、安全、高性能的动态网站的实用指南。对于希望学习或深化...

    web开发_ruby_on_rails

    ### Web开发:深入理解Ruby on Rails #### 一、引言与概述 Ruby on Rails (简称Rails) 是一种用于Web开发的开源框架,基于Ruby语言。Rails的设计理念强调程序员的生产力和代码的简洁性,因此它成为了Ruby语言的...

    中文版rails教程

    在Ruby on Rails中,开发者可以快速构建功能丰富的动态网站,因为它提供了大量的内置功能和库,如数据库连接、ORM(对象关系映射)系统ActiveRecord、模板引擎ActionView以及路由系统ActionController等。...

    Ruby on Rails打造企业级RESTful API项目实战我的云音乐

    《Ruby on Rails打造企业级RESTful API项目实战——我的云音乐》是一本深入探讨如何使用Ruby on Rails框架构建高效、可扩展的企业级API服务的实战教程。Ruby on Rails(简称Rails)是基于Ruby语言的开源Web开发框架...

Global site tag (gtag.js) - Google Analytics