Ruby on Rails的隐藏功能

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"


我现在爱上了div_forcontent_tag_for

1
2
3
<% div_for(@comment) do %>
  <!-- code to display your comment -->
<% end %>

上面的代码显示:

1
  <!-- code to display your comment -->

想要CSS类是comment other_class吗?没问题:

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>

如果你想给你的前缀加上idcontent_tag_for也很好。我用它装礼物。

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在生产环境中缓存类这一事实,以确保只有在应用程序启动时才从数据库中提取常量数据。

例如,对于表示国家的模型,您将定义一个常量,该常量在加载类时执行Country.all查询:

1
2
3
4
5
6
class Country < ActiveRecord::Base
  COUNTRIES = self.all
  .
  .
  .
end

通过引用Country::COUNTRIES,可以在视图模板(可能在select助手中)中使用这个常量。例如:

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

您不需要控制器中的respond_to块来服务这些附加类型。相反,只需为特定类型创建视图,例如'show.kml.builder''index.kml.erb'。当收到'/maps.kml''/maps/1.kml'的请求时,rails将呈现这些特定于类型的模板,并适当地设置响应类型。


以编程方式打印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

在创建自己的表单生成器时非常有用。手动传递的更好的选择是:在您的视图中或在您自己的custom_form_for助手中使用builder。