truncate("And they found that many people were sleeping better.", :omission => "... (continued)", :length => 25)
<%= link_to 'Back', request.env['HTTP_REFERER'] if request.env['HTTP_REFERER']%>
validate_inclusion_of :name,:in=>Employee.all.collect{|t| t.name}
validate_inclusion_of :name,:in=>Employee::NAME.map{|key ,value| value}
page[:cart].visual_effect
validates_confirmation_of :password
<div>
<%= f.label :user_password, 'Password' %>:
<%= f.password_field :password, :size => 40 %>
</div>
<div>
<%= f.label :user_password_confirmation, 'Confirm' %>:
<%= f.password_field :password_confirmation, :size => 40 %>
</div>
<div>
session[:original_uri] = request.request_uri
begin
→ flash[:notice] = "User #{@user.name} deleted"
→ @user.destroy
→ rescue Exception => e
→ flash[:notice] = e.message
→ end
<%= select_tag 'locale', options_for_select(LANGUAGES, I18n.locale),
:onchange => 'this.form.submit()' %>
get(action, parameters=nil,session=nil, flash=nil)
该方法将对指定的action 执行一次HTTP GET 请求,并将执行结果放入HTTP 应答。它
的参数说明如下:
? action :被请求的控制器action ;
? parameters :可选参数,一个hash,其中存放请求参数;
? session:可选参数,一个hash,其中存放session变量:
? flash:可选参数,一个hash,其中存放flash信息
lib 目录还很适合放置模型、视图和控制器之间共享的代码。譬如说你可能需要用一个库来检查
信用卡号的校验和,或是执行某些财务计算,或是计算复活节的日期* 。简而言之,任何不直接属于模
型、视图或者控制器的代码都应该放在lib 目录下。
将文件放到lib 目录下之后,你就可以在应用程序的任何地方使用它们。如果文件中包含了类或
者模块的定义,并且文件名是类名或者模块名的小写格式,那么Rails 就会自动装载这个文件。譬如说
生成PDF 收据的代码位于lib/pdf_stuff/receipt.
要引用1ib 目录下的文件,只需要直接引用文件名。譬如说,假设计算复活节日期的库位于
lib/easter.rb文件,我们就可以在任何模型、视图或者控制器中使用下列代码引用它:
require "easter"
如果库位于lib 目录中的子目录,别忘了在require语句中包含目录名。譬如说如果要在控
制器中引用“计算航空邮件费用”的库,就需要使用下列代码:
require "shipping/airmail"
切换运行时环境的开关在应用程序之外。也就是说,把应用程序从开发环境移到测试环境,再移到
产品环境,应用程序本身的代码不需要做任何修改。当运行应用程序时,你就可以指定运行时环境。譬
如说,如果你使用script/server来运行,可以加上-e 选项:
depot> ruby script/server -e development # the default if -e omitted
depot> ruby script/server -e test
depot> ruby script/server -e production
group_by() 方法可以将集合分组:它会针对集合中的每个对象调用一个代码块,然后根据代码
块的返回值作为分组的键。该方法会返回一个hash ,其中每个键对应一个数组,数组中的元素就是
原集合中拥有同一个分组键的那些对象。譬如说,下列代码将按照作者(author) 对所有帖子
(post) 分组:
groups = posts.group_by {|post| post.author_id}
groups 变量将会指向一个hash ,其中的键是作者id ,值则是包含“对应作者所撰写的帖
子”的数组。
同样的功能也可以这样实现:
groups = posts.group_by {|post| post.author}
两种写法得到的分组是相同的,但第二种写法会用整个Author 对象作为hash 的键( 也就
是说,需要从数据库取出每个Post 对象对应的Author 对象) 。至于究竟应该使用哪种实现方
式,取决于你的应用程序
groups = posts.group_by {|post| post.author}
两种写法得到的分组是相同的,但第二种写法会用整个Author 对象作为hash 的键( 也就
是说,需要从数据库取出每个Post 对象对应的Author 对象) 。至于究竟应该使用哪种实现方
式,取决于你的应用程序。
Rails 还给Enumerable 加上了另外两个方法, index_by 方法接受一个集合作为参数,并
将其转换成一个hash ,其中的值来自原来的集合,而键则是各个元素经过代码块后的返回值。
us_states = State.find(:all)
state_lookup = us_states.index_by {|state| state.short_name}
sum 方法可以对一个集合进行加总:把每个元素传递给一个代码块,并对代码块返回的值进行累
加。该方法默认认为加总的初始值是0 ,你也可以通过传递参数来修改这个初始值。
total_orders = Order.find(:all).sum {|order| order.value }
name.mb_chars
其他的扩展还有squish 方法和squish!方法,它们会把字符串开头和结尾的空格删除,并将
连续的空格转换成一个空格。这在处理Ruby 文档时非常有用。
ActiveSupport给字符串增加了一些方法,以便按照Rails的命名约定将单数形式转换为复数
形式、将小写形式转换为混合大小写的形式,等等。下面列出了一些在普通的应用程序中也可以用到的
辅助方法。
puts "cat".pluralize #=> cats
puts "cats".pluralize #=> cats
puts "erratum".pluralize #=> errata
puts "cats".singularize #=> cat
puts "errata".singularize #=> erratum
puts "first_name".humanize #=> "First name"
你可以指定浮点数的小数位数:
puts (1.337).round_with_precision(2) #=> 1.34
puts Time.now #=> Thu May 18 23:29:14 CDT 2006
puts 20.minutes.ago #=> Thu May 18 23:09:14 CDT 2006
puts 20.hours.from_now #=> Fri May 19 19:29:14 CDT 2006
puts 20.weeks.from_now #=> Thu Oct 05 23:29:14 CDT 2006
puts 20.months.ago #=> Sat Sep 25 23:29:16 CDT 2004
你也可以自己添加用于日期/ 实践格式化的扩展方法。譬如说,你的应用程序可能需要显示序数
日期( 即某一日在一年中是第几天) 。Ruby 的Date 和Time 类都支持用于格式化的
strftime() 方法,因此你可以这样实现需求:
>> d = Date.today
=> #<Date: 4907769/2,0,2299161>
>> d.to_s
=> "2006-05-29"
>> d.strftime("%y-%j")
=> "06-149
groups = posts.group_by {|post| post.author_id}
Rails 提供了一条实现这一功能的捷径。例如上述代码可以改写为:
groups = posts.group_by(&:author_id)
你还可以重做一个或多个迁移任务:
depot> rake db:migrate:redo STEP=3
使用属性读取方法时, ActiveRecord 会尽量将得到的值转化成适当的Ruby 类型( 譬如说,
假设数据库字段是timestamp类型的,就会返回Time 对象) 。如果我们希望得到一个属性的原始
值,可以在属性名称后面加上-before_type_cast,如下所示。