Статьи

5 Потрясающих Новых Рельсов 3 Особенности

После более чем года разработки Ruby on Rails 3 был официально опубликован несколько недель назад. Этот долгожданный выпуск был не просто итеративным обновлением, а главным рефакторингом популярной среды Ruby. Продолжайте читать, чтобы узнать пять самых удивительных новых функций в Ruby Rails 3.


Одна из моих любимых новых функций Ruby on Rails 3 — это введение ненавязчивого JavaScript (UJS) во все его вспомогательные функции JavaScript. В предыдущих версиях Rails JavaScript был встроен в HTML, вызывая уродливый и несколько хрупкий код.

В качестве примера, Rails позволяет вам использовать его link_to method для генерации ссылки удаления для некоторого объекта.

1
<%= link_to «Delete this Post», @post, :confirm => «Do you really want to delete this post?», :method => :delete %>

Использование этого метода в вашем представлении сгенерирует следующее в Rails 2:

1
<a href=»/posts/6″ onclick=»if (confirm(‘Do you really want to delete this post?’)) { var f = document.createElement(‘form’); f.style.display = ‘none’; this.parentNode.appendChild(f); f.method = ‘POST’; f.action = this.href; var m = document.createElement(‘input’); m.setAttribute(‘type’, ‘hidden’); m.setAttribute(‘name’, ‘_method’); m.setAttribute(‘value’, ‘delete’); f.appendChild(m);f.submit(); };return false;»>Delete this Post</a>

Rails 3 сгенерирует что-то гораздо более простое:

1
<a href=’/posts/6″‘ rel=»nofollow» data-method=»delete» data-confirm=»Do you really want to delete this post?»>Delete this Post</a>

Rails 3 заменяет весь встроенный JavaScript парой атрибутов HTML5. Все обработчики событий JavaScript для обработки фактического окна подтверждения и удаления хранятся в одном центральном файле JavaScript, который включен в каждый проект rails.

Одним из больших преимуществ этого нового метода является то, что помощники JavaScript не зависят от фреймворка. Вместо того, чтобы привязываться к библиотеке Prototype, как вы это делали в Rails 2, теперь вы можете выбрать любую среду JavaScript, которая вам нравится (приложения Rails поставляются с Prototype по умолчанию, но теперь jQuery официально поддерживается .


Еще одна замечательная новая функция Rails 3 — это то, что защита XSS теперь включена по умолчанию. Rails 2 поддерживает защиту XSS с помощью метода h .

1
<%= h @comment.text %>

Метод h будет экранировать html и JavaScript, чтобы гарантировать, что вредоносный код на стороне клиента не был выполнен. Этот метод работал отлично, но была одна проблема: вам приходилось не забывать использовать метод h везде, где отображался вводимый пользователем ввод. Если вы забыли хотя бы одно место, то вы были уязвимы для атаки XSS.

В Rails 3 все входные данные по умолчанию экранированы, что избавляет разработчика от необходимости не забывать избегать везде, где может присутствовать вредоносный код. В тех случаях, когда вы хотите, чтобы неэкранированные данные появлялись в вашем представлении, вы можете использовать метод raw чтобы сообщить Rails 3 не экранировать данные.

1
<%= raw @comment.text %>

Rails 3 включает в себя новый классный механизм запросов, который облегчает получение нужных вам данных и дает вам больше гибкости в коде вашего контроллера. Эти изменения появляются в разных местах, но наиболее распространенным случаем является выборка данных в вашем контроллере. В Rails 2 вы могли использовать метод find для извлечения искомых данных, передавая аргументы для указания условий, группировки, ограничений и любую другую информацию запроса. Например:

1
@posts = Post.find(:all, :conditions => [ «category IN (?)», categories], :limit => 10, :order => «created_on DESC»)

находит первые десять сообщений в определенных категориях, упорядоченных по времени создания.

В Rails 3 каждый из переданных параметров имеет свой собственный метод, который можно объединить в цепочку, чтобы получить одинаковые результаты.

1
@posts = Post.where([ «category IN (?)», categories]).order(«created_on DESC»).limit(10)

Запрос фактически не выполняется, пока не потребуются данные; таким образом, эти методы могут даже использоваться в нескольких выражениях.

1
2
3
4
5
6
@posts = Post.where([ «category IN (?)», categories])
if(condition_a)
 @posts = @posts.where([‘approved=?’, true])
else
 @posts = @posts.where([‘approved=?’, false])
end

Это всего лишь простой пример, но он должен дать вам представление о том, как этот новый синтаксис может быть более полезным.


Модуль ActionMailer был переписан, чтобы вашему приложению было намного проще отправлять электронную почту в Rails 3. Изменений довольно много, но вот пара моих любимых.

В Rails Mailer — это класс, который может иметь много методов, каждый из которых обычно настраивает и отправляет электронное письмо. Ранее вам приходилось устанавливать все параметры для каждого письма отдельно в каждом методе.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class UserMailer < ActionMailer::Base
 
 def welcome_email(user)
    from «[email protected]»
 
    # other paramters
 end
 
 def password_reset(user)
    from «[email protected]»
 
    # other parameters
 
 end
 
end

В Rails 3 вы можете указать значения по умолчанию, которые могут быть перезаписаны в каждом методе.

1
2
3
4
5
6
7
class UserMailer < ActionMailer::Base
  default :from => ‘[email protected]’, :return_path => ‘[email protected]
 
 def welcome_email(user)
    # no need to specify from parameter end
 
end

Предыдущие версии Rails требовали, чтобы вы отправляли электронную почту, используя специальные методы, которые были динамически созданы ActionMailer . Например, если вы хотите доставить приветственное письмо в приведенном выше примере, вам нужно позвонить:

1
UserMailer.deliver_welcome_email(@user)

В Rails 3 вы можете просто позвонить

1
UserMailer.welcome_email(@user).deliver

Это имеет смысл с точки зрения семантики и дополнительно позволяет вам извлекать и манипулировать объектом Mail перед доставкой электронной почты.


Одной из сильных сторон инфраструктуры Ruby on Rails является множество гемов, доступных для использования разработчиками. Будь то проверка подлинности , обработка финансовых транзакций , загрузка файлов или почти все остальное, есть шансы, что это поможет вам решить вашу проблему.

Однако могут возникнуть проблемы, если ваши драгоценные камни требуют других драгоценных камней, или, среди прочего, разработчики находятся в других средах. Чтобы помочь решить подобные ситуации, Rails 3 добавляет гем Bundler, чтобы помочь вам управлять вашими зависимостями. Использование Bundler в Rails 3 чрезвычайно просто; добавьте строку для каждого драгоценного камня, который вам требуется в вашем Gemfile, файл, включенный в корень каждого из ваших приложений.

1
gem ‘authlogic’

Как только вы включите все свои драгоценные камни, запустите:

1
bundle install

и Bundler загрузит и сконфигурирует все гемы и их зависимости, которые вам нужны для проекта.

Bundler также позволяет вам указывать определенные драгоценные камни, которые будут настроены только в определенных средах (разработка против производства против тестирования).

Это лишь некоторые из многих изменений, включенных в Ruby on Rails 3. Многие старые API все еще работают в Rails, даже если они устарели, чтобы упростить обновление. Так что, если вы не знаете, стоит ли обновлять ваше существующее приложение rails, то сделайте это!

Спасибо за прочтение!