Ruby on Rails的隐藏特性

作为Ruby的隐藏function的伴侣。

尝试保持它的Rails,因为另一个是Ruby特定示例的更好的地方。 每个post请一个。

为了避免重复的表单提交,Rails提供了一个很好的选项来提交标签:

submit_tag "Submit", :disable_with => "Saving..." 

这增加了提交button的行为,一旦点击就禁用它,并显示“保存…”,而不是“提交”。

Rails 4+

  DEPRECATION WARNING: :disable_with option is deprecated and will be removed from Rails 4.1. Use 'data: { disable_with: 'Text' }' instead. 

因此上述变成:

 submit_tag 'Submit', data: { disable_with: 'Text' } 

integer.ordinalize是我刚刚偶然发现的一个小方法。

 1.ordinalize = "1st" 3.ordinalize = "3rd" 

我目前爱上了div_forcontent_tag_for

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

上面的代码呈现这个:

 <div id="comment_123" class="comment"> <!-- code to display your comment --> </div> 

希望CSS类是comment other_class ? 没问题:

 <% div_for(@comment, :class => 'other_class') do %> <!-- code to display your comment --> <% end %> 

想要一个跨度而不是一个div? 没问题, content_tag_for救援!

 <% content_tag_for(:span, @comment) do %> <% end %> # Becomes... <span id="comment_123" class="comment"> <!-- code to display your comment --> </span> 

content_tag_for也是很好的,如果你想为你的id前缀。 我用它来加载GIF。

 <% 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> 

要查看已安装的gem列表,可以运行:

 gem server 

然后将您的浏览器指向:

 http://localhost:8808 

你可以通过链接到rdoc,web和任何依赖关系来得到一个格式良好的gem列表。 比以下更好:

 gem list 

您可以利用Ruby类定义处于活动状态,并且Rails在生产环境中caching类,以确保在应用程序启动时仅从数据库中获取常量数据。

例如,对于代表国家/地区的模型,您将定义一个常数,用于在加载类时执行Country.all查询:

 class Country < ActiveRecord::Base COUNTRIES = self.all . . . end 

您可以通过引用Country::COUNTRIES在视图模板中使用此常量(可能在select帮助程序中)。 例如:

 <%= select_tag(:country, options_for_select(Country::COUNTRIES)) %> 

在你的environment.rb中,你可以定义新的date/时间格式

 [Time::DATE_FORMATS, Date::DATE_FORMATS].each do |obj| obj[:dots] = "%m.%d.%y" end 

那么在你的意见中你可以使用:

 Created: <%= @my_object.created_at.to_s(:dots) %> 

这将打印如下:

 Created: 06.21.09 

如果你有一个具有一些类方法和一些命名范围的模型:

 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 

然后你可以通过指定的范围来调用类的方法:

 if night_time? Animal.nocturnal.carnivorous.feed_all_with(bacon) end 

Rails 2.3.x现在允许你做:

 render @items 

简单得多

我将从我的最爱之一开始。 当调用一个集合的一个部分,而不是循环你的集合,并调用它的每个项目,你可以使用这个:

 render :partial => 'items', :collection => @items 

这将每个项目调用部分一次,并且每次传递一个局部variables项目。 您不必担心无法检查@项目。

您可以更改testing套件模型的行为。 假设你已经定义了一些after_save方法,你不希望它在你的unit testing中发生。 这是如何工作的:

 # 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 

有趣的特点是数组有特殊的方法来访问它的42元素

 a = [] a.forty_two 

http://railsapi.com/doc/rails-v2.3.8/classes/ActiveSupport/CoreExtensions/Array/Access.html#M003045

如果您为资源添加路由:

 ActionController::Routing::Routes.draw do |map| map.resources :maps end 

并注册更多的MIMEtypes:

 Mime::Type.register 'application/vnd.google-earth.kml+xml', :kml 

您不需要在控制器中使用respond_to块来提供这些附加types。 相反,只需为特定types创build视图,例如'show.kml.builder''index.kml.erb' 。 当收到'/maps.kml''/maps/1.kml'请求时,Rails将呈现这些特定于types的模板,并相应地设置响应types。

 ActionView::Base.default_form_builder = MyFormBuilderClass 

在创build自己的表单构build器时非常有用。 一个更好的替代手动传递:构build器,无论是在您的意见或在您自己的custom_form_for帮手。

返回块是返回值的一个好方法:

 def returns_a_hash(id) returning Hash.new do |result| result["id"] = id end end 

将返回一个哈希。 您也可以replace任何其他types。

以编程方式获取用耙path打印的所有内容:

 Rails.application.routes