Скрытые возможности 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
Другие вопросы по тегам