`

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

 
阅读更多

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

那么从前面的教程中我们学习了如何创建一个简单的博客应用, 我个人觉得无论你是新手还是从rails2 过来, rails3 还是比较容易上手的, 现在我们就来看下rails3 相比rails2, 进步在哪里, 优势又在什么地方. ( 本来这章打算写ujs, 无奈工作繁忙只能推到周日了)

1. 脚本命令

旧的命令                                      新的用法

script/generate                          rails g

script/console                            rails c

script/server                              rails s

script/dbconsole                        rails db

2. 配置文件

rails2: config/environment.rb

  1. Rails::Initializer.run  do  |config|  

  2.     config.load_paths += %W( #{RAILS_ROOT}/extras )   

  3.     config.gem "bj"   

  4.     config.gem "sqlite3-ruby" ,  :lib  =>  "sqlite3"   

  5.     config.gem "aws-s3" ,  :lib  =>  "aws/s3"   

  6.     config.plugins = [ :exception_notification  ]  

  7.     config.time_zone = 'UTC'   

  8. end   

rails3:config/application.rb

  1. module  APP_NAME  

  2.     class  Application < Rails::Application  

  3.         config.load_paths += %W( #{RAILS_ROOT}/extras )   

  4.         config.plugins = [ :exception_notification  ]  

  5.         config.time_zone = 'UTC'   

  6.     end   

  7. end   

这样就变成了一种架构式的应用, 我们可以根据方便的对config 进行操作

3. 路由

rails3, 已经的路由可以继续工作, 而新的路由方式更加简洁.

rails2 :

  1. map.resources  :posts   do  |post|  

  2.     post.resources :comments   

  3. end   

而在rails3, 表达更为形象:

  1. resources  :posts   do   

  2.     resources :comments   

  3. end   

对于一些复杂的路由, rails2:

  1. post.resources  :comments ,  

  2.                  :member  => {  :preview  =>  :post  },  

  3.                  :collection  => {  :archived  =>  :get  }  

rails3 中可以这样表达:

  1. resources  :comments   do   

  2.     member do   

  3.         post :preview   

  4.     end   

  5.     collection do   

  6.         get :archived   

  7.     end   

  8. end   

不够简洁? 我们还可以这样做:

  1. resources  :comments   do   

  2.     post :preview ,  :on  =>  :member   

  3.     get :archived ,  :on  =>  :collection   

  4. end   

对于基本路由, rails2:

  1. map.connect  'login' ,  :controller  =>  'session' ,  :action  =>  'new'   

那么在rails3:

  1. match  'login'  =>  'session#new'   

对于具名路由, rails2:

  1. map.login  'login' ,  :controller  =>  'session' ,  :action  =>  'new'   

rails3:

 

  1. match  'login'  =>  'session#new' ,  :as  =>  :login   

对于程序根路由, rails2:

  1. map.root :controller =>  'users' , :action =>  'index'   

rails3:

  1. root  :to  =>  'users#index'   

对于遗留路由, rails2:

  1. map.connect  ':controller/:action/:id'   

  2. map.connect ':controller/:action/:id.:format'   

那么在rails3 中写法更优雅:

  1. match  ':controller(/:action(/:id(.:format)))'   

对于路由参数, rals2:

  1. map.connect  '/articles/:year/:month/:day' ,  :controller  =>  'posts' ,  :action  =>  'index'   

rails3:

  1. match  '/articles/:year/:month/:day'  =>  "posts#index"   

那么对于存档请求, 比如rails2:

  1. map.connect  '/articles/:year/:month/:day' ,  :controller  =>  'posts' ,  :action  =>  'index'   

  2. map.connect '/articles/:year/:month' ,  :controller  =>  'posts' ,  :action  =>  'index'   

  3. map.connect '/articles/:year' ,  :controller  =>  'posts' ,  :action  =>  'index'   

rails3:

  1. match  '/articles(/:year(/:month(/:day)))'  =>  "posts#index"   

指定请求方式, rails2:

 

  1. map.connect  '/articles/:year' ,  :controller  =>  'posts' ,  :action  =>  'index' ,  

  2. :conditions  => { :method  =>  :get }  

rails3:

  1. match  '/articles/:year'  =>  "posts#index" ,  :via  =>  :get   

  2. # 或者更简单的:   

  3. get '/articles/:year'  =>  "posts#index"   

对于跳转, rails3:

  1. match  'signin' ,  :to  => redirect( "/login" )  

  2. match 'users/:name' ,  :to  => redirect {|params|  "/#{params[:name]}"  }  

  3. match 'google'  => redirect( 'http://www.google.com/' )  

路由约束: rails2 中实际上使用了 :requirements 符号

  1. map.connect  '/:year' ,  :controller  =>  'posts' ,  :action  =>  'index' ,  

  2.                                     :requirements  => {  :year  => /\d{4}/ }  

rails3:

  1. match  '/:year'  =>  "posts#index" ,  :constraints  => { :year  => /\d{4}/}  

  1. :constraints  => {  :user_agent  => /iphone/ }  

  2. :constraints  => {  :ip  => /192\.168\.1\.\d{1,3}/ }  

  3. constraints(:host  => /localhost/)  do   

  4.     resources :posts   

  5. end   

  6. constraints IpRestrictor do   

  7.     get 'admin/accounts'  =>  "queenbee#accounts"   

  8. end   

对于Rack 应用, rails3:

  1. get  'hello'  => proc { |env| [200, {},  "Hello Rack" ] }  

  2.  

  3. get 'rack_endpoint'  => PostsController.action( :index )  

  4.  

  5. get 'rack_app'  => CustomRackApp  

4. Bundler ActionController

一个典型的rails 应用, 我们一般需要在 environment.rb 指定你的 gems:

  1. config.gem  "haml"   

  2. config.gem "chronic" ,  :version  =>  '0.2.3'   

然后我们运行 $ rake gems:install, 该命令会取得并下载然后安装编译这些gems 到你的系统RubyGems 目录中.

之后我们运行 $ rake gems:unpack:dependencise, 把这些gem 打包到你应用程序的vendor/gems 目录中去.

这样做产生的问题:

1. 它直接绑定到Rails

2. 没有从本质上解决依赖问题

3. 运行时容易发生冲突

rails3, 使用了 bundle 命令:

直接在你的 gemfile 中指定你的 gem

  1. gem  "haml"   

  2. gem "chronic" ,  '0.2.3'   

然后运行 $ bundle, 该命令会会取得并下载然后安装编译这些gems

然后运行 $ bundle package gem 源移到/vendor/cache 中去.

这样rails 应用中的gem 与系统中的gem 就不会相冲突.

一般的控制器语法:

  1. class  UsersController < ApplicationController  

  2.     def  index  

  3.         @users  = User.all  

  4.         respond_to do  |format|  

  5.             format.html  

  6.             format.xml { render :xml  =>  @users .to_xml }   

  7.         end   

  8.     end   

  9.  

  10.     def  show  

  11.         @user  = User.find(params[ :id ])  

  12.         respond_to do  |format|  

  13.             format.html # show.html.erb   

  14.             format.xml { render :xml  =>  @user  }  

  15.         end   

  16.     end   

  17.  

  18. ...  

改进的语法:

  1. class  UsersController < ApplicationController  

  2.     respond_to :html ,  :xml ,  :json   

  3.     def  index  

  4.         @users  = User.all  

  5.         respond_with(@users )  

  6.     end   

  7.     def  show  

  8.         @user  = User.find(params[ :id ])  

  9.         respond_with(@user )  

  10.     end   

  11. ...  

5. ActionMailer

rails2:  $ script/generate mailer UserMailer welcome forgot_password

这将创建 app/models/user_mailer.rb

那么在rails3: $ rails g mailer UserMailer welcome forgot_password

这将创建 app/mailers /user_mailer.rb

在实现部分, rails2:

  1. def  welcome(user, subdomain)  

  2.     subject 'Welcome to TestApp'   

  3.     recipients user.email  

  4.     from 'admin@testapp.com'   

  5.     body :user  => user,  :subdomain  => subdomain  

  6. end   

  1. UserMailer.deliver_welcome(user, subdomain)   

rails3:

  1. def  welcome(user, subdomain)  

  2.     @user  = user  

  3.     @subdomain  = subdomain  

  4.     mail(:from  =>  "admin@testapp.com" ,  

  5.             :to  => user.email,  

  6.             :subject  =>  "Welcome to TestApp" )  

  7. end   

  1. UserMailer.welcome(user, subdomain).deliver  

相比rails2, 我们在rails3 下实现一个mail 要简单的多:

  1. class  UserMailer < ActionMailer::Base  

  2.     default :from  =>  "admin@testapp.com" ,  

  3.                 :reply_to  =>  "noreply@testapp.com" ,  

  4.                 "X-Time-Code"  =>  Time .now.to_i.to_s  

  5.     def  welcome(user, subdomain)  

  6.         @user  = user  

  7.         @subdomain  = subdomain  

  8.         attachments['test.pdf' ] =  File .read( "#{Rails.root}/public/test.pdf" )  

  9.         mail(:to  =>  @user .email,  :subject  =>  "Welcome to TestApp" )  do  |format|  

  10.             format.html { render 'other_html_welcome'  }  

  11.             format.text { render 'other_text_welcome'  }  

  12.         end   

  13.     end   

  14. end    

6. ActiveRelation 以及 ActiveModel

rails2, 我们经常使用下面的方法来进行查询:

  1. @posts  = Post.find( :all ,  :conditions  => { :published  =>  true })  

该方式将立即查询数据库然后返回Posts 数组

而在rails3:

  1. @posts  = Post.where( :published  =>  true )  

该方法不会查询数据库, 仅仅返回一个 ActiveRecord::Relation 对象, 然后:

  1. @posts  = Post.where( :published  =>  true )  

  2. if  params[ :order ]  

  3.     @posts  =  @posts .order(params[ :order ])  

  4. end   

  5. @posts . each   do  |p|  

  6.     ...                 # 在这里进行查询 实现延迟加载   

  7. end   

对于命名范围, rails2:

  1. class  Post < ActiveRecord::Base  

  2.     default_scope :order  =>  'title'   

  3.     named_scope :published ,  :conditions  => { :published  =>  true }  

  4.     named_scope :unpublished ,  :conditions  => { :published  =>  false }  

  5. end   

而在rails3:

  1. class  Post < ActiveRecord::Base  

  2.     default_scope order('title' )  

  3.     scope :published , where( :published  =>  true )  

  4.     scope :unpublished , where( :published  =>  false )  

  5. end   

对于查找方法, rails2:

  1. Post.find( :all ,  :conditions  => { :author  =>  "Joe" },  :includes  =>  :comments ,  :order  =>  "title" ,  :limit  => 10)  

rails3:

  1. Post.where( :author  =>  "Joe" ).include( :comments ).order( :title ).limit(10).<strong><span style= "font-size:16px;" >all</span></strong>  

7. 跨站点脚本 (XSS)

rails2, 一般我们输入一段文本的时候, 我们往往会这样写: <%= h @post.body %>

那么在rails3, <%= @post.body %> 默认输出的是一段safe html, 如果想输出XSS, 可以在前面加上 raw

 

分享到:
评论

相关推荐

    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)

    而在接下来的几个月里,全球超过1400名开发者为Rails贡献了1600多个补丁,最终在2008年6月1日,Ruby on Rails 2.1正式发布。这次版本更新不仅带来了诸多新特性,还进一步优化了原有的功能。 #### Ruby on Rails 2.1...

    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