`

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

 
阅读更多

1. 构建多模型表单

现在的博客一般都有便签功能, 方便读者通过关键字索引文章. 要实现该特性你的应用需要在一个表单中交互多个模型. 那么这时候Rails提供了另一个重要的功能: 嵌套表单

为了展示, 我们将为post的多标签提供支持. 首先, 我们需要为标签创建模型:

$ rails g model tag name:string post:references

然后:

$ rake db:migrate

接下来, 编辑post.rb建立另一半关联, 并告诉rails你需要通过posts来编辑tags:

  1. class  Post < ActiveRecord::Base  
  2.   validates :name ,   :presence  =>  true   
  3.   validates :title :presence  =>  true ,  
  4.                     :length  => {  :minimum  => 5 }  
  5.    
  6.   has_many :comments :dependent  =>  :destroy   
  7.   has_many :tags   #实际上对于标签来说应该是一个多对多的关联, 为了方便教程我在这里使用一对多关系   
  8.    
  9.   accepts_nested_attributes_for :tags :allow_destroy  =>  :true ,  
  10.     :reject_if  => proc { |attrs| attrs.all? { |k, v| v.blank? } }  
  11. end   

:allow_destroy 告诉rails在视图上显示一个移除复选框, 而 :reject_if 将会阻止任何空属性的标签的保存.

现在我们修改 views/posts/_form.erb 模板来加入tag:

  1. < % @post.tags.build % >   
  2. < %= form_for(@post) do |post_form| % >   
  3.   < % if @post.errors.any? % >   
  4.     < div   id = "error_explanation" >   
  5.       < h2 > < %= pluralize(@post.errors.count, "error") % >  prohibited this post from being saved: </ h2 >   
  6.   
  7.       < ul >   
  8.       < % @post.errors.full_messages.each do |msg| % >   
  9.         < li > < %= msg % > </ li >   
  10.       < % end % >   
  11.       </ ul >   
  12.     </ div >   
  13.   < % end % >   
  14.   
  15.   < div   class = "field" >   
  16.     < %= post_form.label :name % > < br   />   
  17.     < %= post_form.text_field :name % >   
  18.   </ div >   
  19.   < div   class = "field" >   
  20.     < %= post_form.label :title % > < br   />   
  21.     < %= post_form.text_field :title % >   
  22.   </ div >   
  23.   < div   class = "field" >   
  24.     < %= post_form.label :content % > < br   />   
  25.     < %= post_form.text_area :content % >   
  26.   </ div >   
  27.   < h2 > Tags </ h2 >   
  28.   < %= render  :partial  = >  "tags/form",  :locals  = >  { :form  = >  post_form} % >   
  29.   < div   class = "actions" >   
  30.     < %= post_form.submit % >   
  31.   </ div >   
  32. < % end % >   

现在我们把 form_for @post do |f| 改为 |psot_form| 使之更容易理解.

本示例显示了 render方法的另一个参数 :locals 它可以传递局部变量, 在这里我们希望 form 变量映射为 post_form 对象.

同时我们还在开始处初始化一个tag对象. (试试取消该行会发生什么)

现在创建文件夹 views/tags/ 然后在里面添加一个 _form.erb 局部模板:

  1. < %= form.fields_for :tags do |tag_form| % >   
  2.   < div   class = "field" >   
  3.     < %= tag_form.label :name, 'Tag:' % >   
  4.     < %= tag_form.text_field :name % >   
  5.   </ div >   
  6.   < % unless tag_form.object.nil? || tag_form.object.new_record? % >   
  7.     < div   class = "field" >   
  8.       < %= tag_form.label :_destroy, 'Remove:' % >   
  9.       < %= tag_form.check_box :_destroy % >   
  10.     </ div >   
  11.   < % end % >   
  12. < % end % >   

同样, 请留意下tags表单生成的html代码.

最后, 我们编辑show.html.erb来显示这些tags:

  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. < p >   
  19.   < b > Tags: </ b >   
  20.   < %= @post.tags.map { |t| t.name }.join(", ") % >   
  21. </ p >   
  22.    
  23. < h2 > Comments </ h2 >   
  24. < %= render @post.comments % >   
  25.    
  26. < h2 > Add a comment: </ h2 >   
  27. < %= render "comments/form" % >   
  28.    
  29.    
  30. < %= link_to 'Edit Post', edit_post_path(@post) % >  |  
  31. < %= link_to 'Back to Posts', posts_path % >  |  

现在你可以直接在创建或编辑post页面中添加或删除tags了.

不过 @post.tags.map { |t| t.name }.join(", ") 感觉不是那么友好, 我们可以通过帮助器来改变.

2. 视图帮助器

视图帮助器位于 app/helpers, 可以提供一些可重用的视图代码片段. 在这里, 我们需要把所有tags的名称连起来并用逗号隔开, 由于它位于Posts视图, 那么我们可以在 PostsHelper 中实现:

  1. module  PostsHelper  
  2.   def  join_tags(post)  
  3.     post.tags.map { |t| t.name }.join(", " )  
  4.   end   
  5. end   

然后把上面的 <%= @post.tags.map { |t| t.name }.join(", ") %> 改为:

  <%= join_tags @post %>

分享到:
评论

相关推荐

    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时代下如何利用这一强大框架构建高效、安全、高性能的动态网站的实用指南。对于希望学习或深化...

    中文版rails教程

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

    web开发_ruby_on_rails

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

    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