- 浏览: 250236 次
- 性别:
- 来自: 内蒙古
文章分类
- 全部博客 (237)
- Android 功能实现 (31)
- sql数据库的学习 (8)
- Android 美化界面 (2)
- Android 优化 (1)
- Ruby on Rails 方面 (45)
- git 方面的学习 (1)
- ruby 编程的琢磨 (13)
- linux下工具软件 (13)
- 操作系统的学习 (40)
- 非技术 (13)
- 网站开发 (18)
- js 学习笔记 (19)
- css学习 (5)
- 回顾总结 (2)
- Delphi 学习 (2)
- C 语言学习笔记 (1)
- 数据结构 (1)
- node js 学习 (6)
- 设计模式 (2)
- mongdb 学习笔记 (0)
- 软件服务 (3)
- osx系统 (4)
- 搜索引擎 (1)
- 测试工具 (1)
- Aliyun (1)
- 前端JS (1)
- python学习 (0)
- iOS系统 (1)
- 分布式锁 (1)
- 开发工具 (0)
- java代码 (2)
- java (1)
最新评论
-
jiguanghover:
写的不错,收藏一下
Ubuntu下RVM, Ruby, rails安装详细 和 卸载 -
maoghj:
回顾总结(二) -
yun2223:
对楼主表示感谢
Android控件开发之Gallery3D效果 -
zw_lovec:
说清楚点吧 亲 加点注释
out of memory -
lzyfn123:
http://www.iteye.com/images/smi ...
ruby-string 字符串的学习
<!-- @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
-
Rails::Initializer.run do |config|
-
config.load_paths += %W( #{RAILS_ROOT}/extras )
-
config.gem "bj"
-
config.gem "sqlite3-ruby" , :lib => "sqlite3"
-
config.gem "aws-s3" , :lib => "aws/s3"
-
config.plugins = [ :exception_notification ]
-
config.time_zone = 'UTC'
-
end
rails3:config/application.rb
-
module APP_NAME
-
class Application < Rails::Application
-
config.load_paths += %W( #{RAILS_ROOT}/extras )
-
config.plugins = [ :exception_notification ]
-
config.time_zone = 'UTC'
-
end
-
end
这样就变成了一种架构式的应用, 我们可以根据方便的对config 进行操作
3. 路由
在rails3 中, 已经的路由可以继续工作, 而新的路由方式更加简洁.
在 rails2 中:
-
map.resources :posts do |post|
-
post.resources :comments
-
end
而在rails3 中, 表达更为形象:
-
resources :posts do
-
resources :comments
-
end
对于一些复杂的路由, rails2:
-
post.resources :comments ,
-
:member => { :preview => :post },
-
:collection => { :archived => :get }
在rails3 中可以这样表达:
-
resources :comments do
-
member do
-
post :preview
-
end
-
collection do
-
get :archived
-
end
-
end
不够简洁? 我们还可以这样做:
-
resources :comments do
-
post :preview , :on => :member
-
get :archived , :on => :collection
-
end
对于基本路由, rails2:
-
map.connect 'login' , :controller => 'session' , :action => 'new'
那么在rails3 中:
-
match 'login' => 'session#new'
对于具名路由, rails2:
-
map.login 'login' , :controller => 'session' , :action => 'new'
在rails3 中:
-
match 'login' => 'session#new' , :as => :login
对于程序根路由, rails2:
-
map.root :controller => 'users' , :action => 'index'
rails3:
-
root :to => 'users#index'
对于遗留路由, rails2:
-
map.connect ':controller/:action/:id'
-
map.connect ':controller/:action/:id.:format'
那么在rails3 中写法更优雅:
-
match ':controller(/:action(/:id(.:format)))'
对于路由参数, rals2:
-
map.connect '/articles/:year/:month/:day' , :controller => 'posts' , :action => 'index'
rails3:
-
match '/articles/:year/:month/:day' => "posts#index"
那么对于存档请求, 比如rails2:
-
map.connect '/articles/:year/:month/:day' , :controller => 'posts' , :action => 'index'
-
map.connect '/articles/:year/:month' , :controller => 'posts' , :action => 'index'
-
map.connect '/articles/:year' , :controller => 'posts' , :action => 'index'
在rails3 中:
-
match '/articles(/:year(/:month(/:day)))' => "posts#index"
指定请求方式, rails2:
-
map.connect '/articles/:year' , :controller => 'posts' , :action => 'index' ,
-
:conditions => { :method => :get }
在rails3 中:
-
match '/articles/:year' => "posts#index" , :via => :get
-
# 或者更简单的:
-
get '/articles/:year' => "posts#index"
对于跳转, rails3:
-
match 'signin' , :to => redirect( "/login" )
-
match 'users/:name' , :to => redirect {|params| "/#{params[:name]}" }
-
match 'google' => redirect( 'http://www.google.com/' )
路由约束: rails2 中实际上使用了 :requirements 符号
-
map.connect '/:year' , :controller => 'posts' , :action => 'index' ,
-
:requirements => { :year => /\d{4}/ }
在rails3 中:
-
match '/:year' => "posts#index" , :constraints => { :year => /\d{4}/}
-
:constraints => { :user_agent => /iphone/ }
-
:constraints => { :ip => /192\.168\.1\.\d{1,3}/ }
-
constraints(:host => /localhost/) do
-
resources :posts
-
end
-
constraints IpRestrictor do
-
get 'admin/accounts' => "queenbee#accounts"
-
end
对于Rack 应用, rails3:
-
get 'hello' => proc { |env| [200, {}, "Hello Rack" ] }
-
-
get 'rack_endpoint' => PostsController.action( :index )
-
-
get 'rack_app' => CustomRackApp
4. Bundler 与 ActionController
一个典型的rails 应用, 我们一般需要在 environment.rb 指定你的 gems:
-
config.gem "haml"
-
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
-
gem "haml"
-
gem "chronic" , '0.2.3'
然后运行 $ bundle, 该命令会会取得并下载然后安装编译这些gems
然后运行 $ bundle package 把gem 源移到/vendor/cache 中去.
这样rails 应用中的gem 与系统中的gem 就不会相冲突.
一般的控制器语法:
-
class UsersController < ApplicationController
-
def index
-
@users = User.all
-
respond_to do |format|
-
format.html
-
format.xml { render :xml => @users .to_xml }
-
end
-
end
-
-
def show
-
@user = User.find(params[ :id ])
-
respond_to do |format|
-
format.html # show.html.erb
-
format.xml { render :xml => @user }
-
end
-
end
-
-
...
改进的语法:
-
class UsersController < ApplicationController
-
respond_to :html , :xml , :json
-
def index
-
@users = User.all
-
respond_with(@users )
-
end
-
def show
-
@user = User.find(params[ :id ])
-
respond_with(@user )
-
end
-
...
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:
-
def welcome(user, subdomain)
-
subject 'Welcome to TestApp'
-
recipients user.email
-
from 'admin@testapp.com'
-
body :user => user, :subdomain => subdomain
-
end
-
UserMailer.deliver_welcome(user, subdomain)
在rails3 中:
-
def welcome(user, subdomain)
-
@user = user
-
@subdomain = subdomain
-
mail(:from => "admin@testapp.com" ,
-
:to => user.email,
-
:subject => "Welcome to TestApp" )
-
end
-
UserMailer.welcome(user, subdomain).deliver
相比rails2, 我们在rails3 下实现一个mail 要简单的多:
-
class UserMailer < ActionMailer::Base
-
default :from => "admin@testapp.com" ,
-
:reply_to => "noreply@testapp.com" ,
-
"X-Time-Code" => Time .now.to_i.to_s
-
def welcome(user, subdomain)
-
@user = user
-
@subdomain = subdomain
-
attachments['test.pdf' ] = File .read( "#{Rails.root}/public/test.pdf" )
-
mail(:to => @user .email, :subject => "Welcome to TestApp" ) do |format|
-
format.html { render 'other_html_welcome' }
-
format.text { render 'other_text_welcome' }
-
end
-
end
-
end
6. ActiveRelation 以及 ActiveModel
在rails2 中, 我们经常使用下面的方法来进行查询:
-
@posts = Post.find( :all , :conditions => { :published => true })
该方式将立即查询数据库然后返回Posts 数组
而在rails3 中:
-
@posts = Post.where( :published => true )
该方法不会查询数据库, 仅仅返回一个 ActiveRecord::Relation 对象, 然后:
-
@posts = Post.where( :published => true )
-
if params[ :order ]
-
@posts = @posts .order(params[ :order ])
-
end
-
@posts . each do |p|
-
... # 在这里进行查询, 实现延迟加载
-
end
对于命名范围, 在rails2 中:
-
class Post < ActiveRecord::Base
-
default_scope :order => 'title'
-
named_scope :published , :conditions => { :published => true }
-
named_scope :unpublished , :conditions => { :published => false }
-
end
而在rails3 中:
-
class Post < ActiveRecord::Base
-
default_scope order('title' )
-
scope :published , where( :published => true )
-
scope :unpublished , where( :published => false )
-
end
对于查找方法, rails2:
-
Post.find( :all , :conditions => { :author => "Joe" }, :includes => :comments , :order => "title" , :limit => 10)
在rails3:
-
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
发表评论
-
OpenSSL功能集合
2020-04-22 18:59 444OpenSSL中算法记录 1、证书(X.509证书 ... -
Aliyun-OSS 使用 - 图片持久化
2020-03-03 13:04 545Aliyun OSS 使用 - 图片持久化 参考:ali ... -
Sign in with Apple REST API (Rails)
2020-02-28 12:30 1105# 文档(Apple授权登录) https://deve ... -
RQRCode插件使用
2019-03-07 15:08 326def config { le ... -
gems 列表(rails 插件) 二
2014-11-19 19:41 491rails_best_practices 最佳实现 new ... -
rails 利用 Spreadsheet 导出xls格式数据
2014-10-08 17:22 7181、链接 XXX_path(forma ... -
rvm 使用记录
2014-09-26 11:11 613rvm是一个命令行工具,可以提供一个便捷的多版本ruby环 ... -
rails3内置gem包
2014-09-10 13:14 504rails3内置gem包: ... -
rails mongoid + carrierwave
2014-06-13 18:11 651中间插件:gem 'carrierwa ... -
rails 错误提示样式
2014-06-11 10:20 521源码 # Specify the proc us ... -
ROR Callbacks函数
2014-05-13 16:49 482Active Record Callbacks: ## ... -
字符串与对象的转化
2014-03-06 10:51 701classify: http://apidock.com/ ... -
nginx+unicorn+rails 配置文件
2014-02-17 14:43 629nginx+unicorn+rails 配置文件 ... -
ruby 里的正则表示
2014-01-22 17:27 0# ruby 中的正则表示 ... -
rails中Elasticsearch的客户端Tire配置
2014-01-22 15:25 1170$ gem install tire || http ... -
rails 多表关联
2013-12-09 16:28 0rails 多表关联 class Post < ... -
rails 测试 Rspec
2013-11-14 13:32 0在Gemfile中加入: group :test, ... -
rails 评论/回复插件 acts_as_commentable_with_threading
2013-11-13 19:04 1224acts_as_commentable_with_thre ... -
rails Rspec测试框架
2013-11-03 17:46 649Rspec rails的测试框架 ... -
rails 配置详解
2013-09-16 17:05 1248配置文件(config) 在Rails中,可以 ...
相关推荐
在"Ruby on Rails入门例子"中,我们可能会遇到以下关键概念: - **路由(Routes)**:Rails的路由系统将URL映射到特定的控制器动作,定义了应用的导航结构。在`config/routes.rb`文件中配置路由规则。 - **生成器...
Ruby on Rails拥有庞大的开发者社区,提供了丰富的教程、插件和库。Stack Overflow、GitHub、RailsGuides和RailsCasts等资源对初学者和高级开发者都非常有帮助。 以上只是Ruby on Rails的部分基础知识,实际开发中...
《基于Ruby On Rails的在线购书系统》是一个深入探讨如何利用Ruby on Rails框架构建电子商务平台的项目。Ruby on Rails(RoR)是一个开源的Web应用框架,它遵循MVC(模型-视图-控制器)架构模式,以Ruby编程语言为...
Ruby on Rails 是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,使得开发者可以高效地构建功能丰富的Web应用程序。在这个“Ruby on Rails博客程序”中,我们将深入探讨如何在...
Ruby on Rails,简称RoR,是一款基于Ruby编程语言的开源Web开发框架,它遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率,同时保持代码的简洁和可读性。RoR的核心理念是“Don't Repeat Yourself”(DRY)...
而在接下来的几个月里,全球超过1400名开发者为Rails贡献了1600多个补丁,最终在2008年6月1日,Ruby on Rails 2.1正式发布。这次版本更新不仅带来了诸多新特性,还进一步优化了原有的功能。 #### Ruby on Rails 2.1...
通过这个Ruby on Rails博客制作的例子,你不仅学会了如何构建一个基本的Web应用,还对Rails的MVC架构、数据库操作、路由设计、表单处理、测试和部署有了深入的理解。这是一个很好的起点,随着你对Rails的深入学习,...
Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web应用开发。API(Application Programming Interface)是Rails提供的一种允许...
这个简单的blog项目是初学者了解Rails的好起点,通过实践,可以掌握Rails的基本用法,进一步深入学习数据库操作、模板引擎、路由、控制器以及测试等方面的知识,为成为Ruby on Rails开发大师打下坚实基础。
“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,简称RoR,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。RoR强调“DRY”(Don't Repeat Yourself)原则和“Convention ...
Ruby on Rails 是一个使用Ruby语言编写的开源Web应用框架,其设计宗旨是使得开发Web应用更为快速和简洁。它基于著名的模型-视图-控制器(MVC)架构模式,旨在以更少的代码实现更多功能,提高开发效率。Ruby on Rails...
Ruby 是一种面向对象的、动态类型的编程语言,而 Rails 是一个基于 MVC(模型-视图-控制器)架构的 Web 开发框架,它极大地简化了 Web 应用程序的构建过程。 在 Ruby 1.8.7 版本中,一些关键特性包括: 1. 全局变量...
《构建动态Web 2..0网站:使用Ruby on Rails》不仅是一本介绍Ruby on Rails基础知识的书籍,更是一部深入探讨Web 2.0时代下如何利用这一强大框架构建高效、安全、高性能的动态网站的实用指南。对于希望学习或深化...
### Web开发:深入理解Ruby on Rails #### 一、引言与概述 Ruby on Rails (简称Rails) 是一种用于Web开发的开源框架,基于Ruby语言。Rails的设计理念强调程序员的生产力和代码的简洁性,因此它成为了Ruby语言的...
在Ruby on Rails中,开发者可以快速构建功能丰富的动态网站,因为它提供了大量的内置功能和库,如数据库连接、ORM(对象关系映射)系统ActiveRecord、模板引擎ActionView以及路由系统ActionController等。...
《Ruby on Rails打造企业级RESTful API项目实战——我的云音乐》是一本深入探讨如何使用Ruby on Rails框架构建高效、可扩展的企业级API服务的实战教程。Ruby on Rails(简称Rails)是基于Ruby语言的开源Web开发框架...