Скрытые возможности Ruby on Rails
Как компаньон для скрытых возможностей Ruby.
Постарайтесь сохранить его в Rails, так как другой - лучшее место для примеров, специфичных для Ruby. Один на пост, пожалуйста.
15 ответов
Чтобы избежать дублирования отправки формы, в Rails есть хорошая опция для отправки тегов:
submit_tag "Submit", :disable_with => "Saving..."
Это добавляет поведение к кнопке отправки, чтобы отключить ее после нажатия и отображать "Сохранение..." вместо "Отправить".
Рельсы 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
, Я использую его для загрузки картинок.
<% 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 server
Затем укажите ваш браузер на:
http://localhost:8808
Вы получаете красиво отформатированный список ваших драгоценных камней со ссылками на rdoc, Интернет и любые зависимости. Гораздо приятнее чем:
gem list
Вы можете воспользоваться тем, что определения классов Ruby активны и что Rails кэширует классы в производственной среде, чтобы гарантировать, что постоянные данные извлекаются из базы данных только при запуске вашего приложения.
Например, для модели, которая представляет страны, вы должны определить константу, которая выполняет Country.all
запрос, когда класс загружен:
class Country < ActiveRecord::Base
COUNTRIES = self.all
.
.
.
end
Вы можете использовать эту константу в шаблоне представления (возможно, в помощнике выбора), обращаясь к Country::COUNTRIES
, Например:
<%= select_tag(:country, options_for_select(Country::COUNTRIES)) %>
В вашем environment.rb вы можете определить новые форматы даты / времени, например
[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
Это вызовет частичное значение один раз для каждого элемента и каждый раз будет передавать элемент локальной переменной. Вам не нужно беспокоиться о нулевой проверке @items.
Забавная особенность в том, что массив имеет специальный метод для доступа к его 42 элементам
a = []
a.forty_two
http://railsapi.com/doc/rails-v2.3.8/classes/ActiveSupport/CoreExtensions/Array/Access.html
Вы можете изменить поведение модели для вашего набора тестов. Скажем, у вас есть определенный метод after_save, и вы не хотите, чтобы это происходило в ваших модульных тестах. Вот как это работает:
# 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
Если вы добавите маршрутизацию для ресурса:
ActionController::Routing::Routes.draw do |map|
map.resources :maps
end
И зарегистрируйте дополнительные mime-типы:
Mime::Type.register 'application/vnd.google-earth.kml+xml', :kml
Вам не нужен respond_to
блок в вашем контроллере для обслуживания этих дополнительных типов. Вместо этого просто создайте представления для определенных типов, например 'show.kml.builder'
или же 'index.kml.erb'
, Rails будет отображать эти специфичные для типа шаблоны при запросах '/maps.kml'
или же '/maps/1.kml'
получены, устанавливая тип ответа соответствующим образом.
ActionView::Base.default_form_builder = MyFormBuilderClass
Очень полезно, когда вы создаете свои собственные конструкторы форм. Гораздо лучшая альтернатива ручной передаче: строитель, как по вашему мнению, так и по вашему custom_form_for
помощник.
Возвращающий блок - отличный способ вернуть значения:
def returns_a_hash(id)
returning Hash.new do |result|
result["id"] = id
end
end
Вернет хеш. Вы можете заменить любые другие типы.
Распечатайте все с помощью граблей программно:
Rails.application.routes