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_for
和content_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