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 |
在创建自己的表单生成器时非常有用。手动传递的更好的选择是:在您的视图中或在您自己的