Hidden Features of Ruby on Rails
作为红宝石隐藏特征的伴侣。
试着让它保持在Rails上,因为对于特定于Ruby的示例来说,另一个地方更好。请给每个岗位一个。
为了避免重复的表单提交,Rails有一个很好的提交标签选项:
| 1 | submit_tag"Submit", :disable_with =>"Saving..." | 
这将向"提交"按钮添加行为,以在单击后禁用它,并显示"保存…"而不是"提交"。
轨道4 +
| 1 2 |  DEPRECATION WARNING: :disable_with option is deprecated and  will be removed from Rails 4.1. Use 'data: { disable_with: 'Text' }' instead. | 
因此,上述内容变成:
| 1 | submit_tag 'Submit', data: { disable_with: 'Text' } | 
integer.ordinalize是不久前我偶然发现的一个小方法。
| 1 2 | 1.ordinalize ="1st" 3.ordinalize ="3rd" | 
我现在爱上了
| 1 2 3 | <% div_for(@comment) do %> <!-- code to display your comment --> <% end %> | 
上面的代码显示:
| 1 |   <!-- code to display your comment --> | 
想要CSS类是
| 1 2 3 | <% div_for(@comment, :class => 'other_class') do %> <!-- code to display your comment --> <% end %> | 
想要一个跨度而不是一个分区?没问题,江户十一〔九〕去营救!
| 1 2 3 4 5 6 7 8 | <% content_tag_for(:span, @comment) do %> <% end %> # Becomes... <span id="comment_123" class="comment"> <!-- code to display your comment --> </span> | 
如果你想给你的前缀加上
| 1 2 3 4 5 6 7 8 9 | <% content_tag_for(:span, @comment, 'loading') do %> <%= image_tag 'loading.gif' -%> <% end %> # Becomes... <span id="loading_comment_123" class="comment"> <img src="loading.gif" /> </span> | 
要查看已安装的gems列表,可以运行:
| 1 | gem server | 
然后将浏览器指向:
| 1 | http://localhost:8808 | 
您可以得到一个格式良好的gem列表,其中包含指向RDOC、Web和任何依赖项的链接。比:
| 1 | gem list | 
您可以利用Ruby类定义是活动的和Rails在生产环境中缓存类这一事实,以确保只有在应用程序启动时才从数据库中提取常量数据。
例如,对于表示国家的模型,您将定义一个常量,该常量在加载类时执行
| 1 2 3 4 5 6 | class Country < ActiveRecord::Base COUNTRIES = self.all . . . end | 
通过引用
| 1 | <%= select_tag(:country, options_for_select(Country::COUNTRIES)) %> | 
在environment.rb中,可以定义新的日期/时间格式,例如
| 1 2 3 | [Time::DATE_FORMATS, Date::DATE_FORMATS].each do |obj| obj[:dots] ="%m.%d.%y" end | 
因此,在您的视图中,您可以使用:
| 1 | Created: <%= @my_object.created_at.to_s(:dots) %> | 
打印方式如下:
| 1 | Created: 06.21.09 | 
如果模型具有一些类方法和一些命名范围:
| 1 2 3 4 5 6 7 8 9 10 | class Animal < ActiveRecord::Base named_scope 'nocturnal', :conditions => {'nocturnal' => true} named_scope 'carnivorous', :conditions => {'vegetarian' => true} def self.feed_all_with(food) self.all.each do |animal| animal.feed_with(food) end end end | 
然后可以通过命名的作用域调用类方法:
| 1 2 3 | if night_time? Animal.nocturnal.carnivorous.feed_all_with(bacon) end | 
Rails 2.3.x现在允许您执行以下操作:
| 1 | render @items | 
简单得多。
我先从我最喜欢的一个开始。当用集合调用分部时,您可以使用以下方法,而不是循环调用集合并为每个项调用它:
| 1 | render :partial => 'items', :collection => @items | 
这将为每个项调用一次分部,并每次传递一个局部变量项。你也不必担心没有检查@items。
有趣的是,数组具有访问其42个元素的特殊方法
| 1 2 | a = [] a.forty_two | 
http://railsapi.com/doc/rails-v2.3.8/classes/activesupport/coreeextensions/array/access.html_m003045
您可以为测试套件更改模型的行为。假设您定义了一些after-save方法,并且不希望在单元测试中发生这种情况。这就是它的工作原理:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # models/person.rb class Person < ActiveRecord::Base def after_save # do something useful end end # test/unit/person_test.rb require 'test_helper' class PersonTest < ActiveSupport::TestCase class ::Person def after_save # do nothing end end test"something interesting" do # ... end end | 
如果为资源添加路由:
| 1 2 3 | ActionController::Routing::Routes.draw do |map| map.resources :maps end | 
并注册其他MIME类型:
| 1 | Mime::Type.register 'application/vnd.google-earth.kml+xml', :kml | 
您不需要控制器中的
以编程方式打印Rake Routes的所有内容:
| 1 | Rails.application.routes | 
返回块是返回值的好方法:
| 1 2 3 4 5 | def returns_a_hash(id) returning Hash.new do |result| result["id"] = id end end | 
将返回哈希。您也可以替换任何其他类型。
| 1 | ActionView::Base.default_form_builder = MyFormBuilderClass | 
在创建自己的表单生成器时非常有用。手动传递的更好的选择是:在您的视图中或在您自己的