ruby-on-rails — вопросы с ответами

Ruby on Rails – это инструмент разработки, который предоставляет веб-разработчикам фреймворк, обеспечивающий структуру для всего кода, который они пишут. Платформа Rails помогает разработчикам создавать веб-сайты и приложения, поскольку она отделяет и упрощает общие повторяющиеся задачи.

Rails написан на Ruby, языке программирования, который также используется вместе с Rails. Ruby для Rails – как PHP для Symfony и Zend, а Python для Django. Привлекательность Ruby для разработчиков заключается в элегантности и краткости языка.

Особенности

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

Другой особенностью Rails является акцент на RESTful-дизайне приложений. REST (Transfer State Transfer) – это стиль архитектуры программного обеспечения, основанный на отношениях клиент-сервер. Он поощряет логическую структуру в приложениях, что означает, что они могут быть легко представлены как API (интерфейс прикладного программирования).

С точки зрения управления проектами сообщество Ruby on Rails отстаивает гибкую веб-разработку – метод итеративной разработки, который поощряет совместный и гибкий подход, особенно хорошо подходящий для разработки проектов с быстро меняющимися требованиями.

Преимущества и недостатки

Плюсы использования Ruby on Rails:

  • Процесс программирования намного быстрее, чем с другими средами и языками, отчасти из-за объектно-ориентированной природы Ruby и обширной коллекции открытого исходного кода, доступного в сообществе Rails;
  • Соглашения Rails также позволяют разработчикам легко переключаться между различными проектами Rails, так как каждый проект будет следовать одной и той же структуре и методам кодирования;
  • Rails хорош для быстрой разработки приложений (RAD), поскольку этот фреймворк позволяет легко приспосабливаться к любым изменениям;
  • Код на Ruby очень читабелен и в основном самодокументирован. Это повышает продуктивность, так как нет необходимости писать отдельную документацию для других разработчиков, взявшихся за ваш проект;
  • Rails уделяет большое внимание тестированию и имеет хорошие тестовые фреймворки;
  • Rails и большинство его библиотек имеют открытый исходный код. Поэтому, в отличие от других коммерческих сред разработки, вам не придется тратить деньги на лицензионные соглашения.

Потенциальные проблемы и ограничения:

  • Не все веб-хосты могут поддерживать Rails. Это прежде всего объясняется тем, что он может быть более ресурсоемким, чем PHP, что отпугивает низкоуровневых провайдеров совместного хостинга. Тем не менее, это ни в коем случае не является полной закономерностью. Конечно же, существуют дружественные к Rails хосты, например, Heroku и EngineYard. Кроме того, вы можете разместить свое приложение Rails на виртуальном частном сервере (VPS) с Amazon EC2, Rackspace или Linode. После этого вы получите полный контроль над сервером и сможете выделить достаточно ресурсов для своего приложения;
  • Java и PHP более широко используются, и на этих языках гораздо больше разработчиков. Количество разработчиков Ruby растет из года в год, так как все больше людей переходят на него с других языков программирования. Одним из основных различий между Ruby и другими сообществами является количество открытого исходного кода (гемов), который является общедоступным. На момент написания этой статьи существует 63 711 гемов, которые можно использовать для улучшения своего приложения;
  • Производительность и масштабы. Одно время были опасения, что приложения на Rails не такие быстрые, как Java или C. И хотя это утверждение верно, для большинства приложений существующие различия в быстродействии будут практически незаметными. Есть множество известных организаций, которые используют Rails для питания своих сайтов, включая AirBnB, Yellow Pages, Groupon, Channel 5 и Gov.uk. Существует также возможность запуска приложения под JRuby, что даст вам такие же параметры производительности, как и у Java.

Простота структуры

Хотя большинство разработчиков согласны с тем, что Ruby удобен, некоторые считают его слишком удобным. Они беспокоятся о том, что Ruby предоставляет слишком много свободы, которая иногда может становиться причиной больших проблем. Это можно проиллюстрировать несколькими “обезьянскими патчами” (подменой методов и атрибутов):

"1".to_i
#=> 1
class String
def to_i
raise 'foobar'
end
end
"1".to_i
#=> RuntimeError: foobar

Именно так просто: всего пять строк кода, с помощью которых мы взяли существующий класс и изменили его поведение. Ничто в Ruby не является неприкасаемым – даже строка. Конкретно эту ошибку легко заметить, но все может стать гораздо более опасным:

class String
def to_i
self.to_f - 1.13
end
end
"2".to_i
#=> 0.8700000000000001

Вот так просто мы внедрили ошибку в класс String, которая может быть скрыта слоями сложного кода.

Итак, вы можете подумать: абсолютно любой человек может испортить структуру моего приложения? И хотя наведенные примеры выглядят действительно устрашающе – на самом деле это не так. За годы использования Ruby у большинства разработчиков возникает ровно ноль проблем с подобными вещами. Такая ситуация может показаться нелогичной и слишком рисковой, но то же самое происходит с автомобилями на скорости в 80 км в час, мчащихся в противоположных направлениях, разделенных только тонкой белой линией посреди дороги. На практике же оба метода работают превосходно.

Полезные особенности Ruby

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

Динамическая типизация

В статически типизированных языках имеются очень хорошие возможности, такие как тестирование во время компиляции и поддержка IDE. Тем не менее динамическая типизация очень помогает на ранних этапах проектов и сглаживает изменения, особенно в начале и середине разработки.

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

Неявная типизация

Это фактически просто расширение динамического набора текста. В Ruby методы, которые как ожидаются, смогут работать с объектами String, не проверяют is_a? (String). Они проверяют, является ли объект response_to? (: To_str), а затем вызывает to_str для объекта, если это так. Точно так же объекты, которые представляют Paths в Ruby, могут реализовать метод to_path для обеспечения представления этого значения.

В Rails мы используем эту технику для объектов, которые имеют «модельные» характеристики, ожидая, что они будут response_to? (: To_model). Это позволяет нам поддерживать любой объект в соответствующих контекстах, при условии, что эти объекты могут предоставить нам «модельное» представление себя.

Крутые модули

Ruby предоставляет языковую функцию, похожую на "traits" в Scala, Squeak и Perl. По сути, модули Ruby позволяют динамически добавлять новые элементы иерархии классов во время выполнения. Использование super динамически оценивается во время выполнения, чтобы принять во внимание любые модули, которые могли быть добавлены. Это позволяет легко расширять функциональные возможности суперкласса столько раз, сколько необходимо, без необходимости решать, где окажется super во время объявления класса.

Кроме того, модули Ruby предоставляют хуки жизненных циклов append_features и included, которые позволяют использовать модули для изоляции расширений друг от друга и динамического расширения классов на основе включения функций.

Тела классов

В Ruby тела классов не являются особым контекстом. Они просто контекст, в котором self указывает на объект класса. Если вы использовали Rails, вы, вероятно, видели такой код:

class Comment < ActiveRecord::Base
validates_presence_of :post_id
end

Может показаться, что validates_presence_of – это языковая функция, но на самом деле это метод, вызываемый в Comment, предоставляемый ActiveRecord::Base.

Этот метод может выполнять произвольный код (и в контексте класса), включая создание новых методов, выполнение других частей кода или обновление переменной экземпляра класса. В отличие от аннотаций Java, которые должны выполняться во время компиляции, тела классов Ruby могут принимать во внимание информацию времени выполнения программы, такую как динамически предоставляемые параметры или результаты оценки другого кода.

Распространенные ошибки при разработке приложений в Ruby on Rails

Неправильное использование метода предиката

Часто встречающейся ошибкой при разработке Rails является неправильное использование методов предикатов. Для тех, кто не знает, метод предикатов – это любой метод, который синтаксически оканчивается знаком вопроса (?) И должен возвращать только достоверный результат. Достоверный результат может быть true или false, но важно понимать небольшую разницу в некоторых потенциальных значениях. В частности, оба значения false и nil считаются значениями truthy-false в Ruby. Это значит, что они оба будут рассматриваться как ложные или отрицательные результаты при возврате методом предиката. Любое другое значение будет считаться truthy-true, что фактически указывает на истинный или положительный результат.

Слишком частое использование Gems

Самый большой потенциальный недостаток при добавлении нового "джема" (пакет с библиотекой или приложением) в ваше приложение – это ошибки, приводящие к разрушению приложений. В то время как умные разработчики будут использовать только самые стабильные и хорошо проверенные джемы, даже те могут вызывать неожиданное поведение или иметь внутренние ошибки, которые незаметны с самого начала.

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

Прямой вызов внешних служб

Еще одна распространенная ошибка при начале работы с Rails – это прямые вызовы приложений сторонним сервисам. Например, когда новый пользователь регистрируется и предоставляет свой номер телефона, ваше приложение может использовать стороннюю службу (например, Twilio) для автоматической отправки пользователю кода подтверждения многофакторной аутентификации.

Если метод #send_authentication_code вызывается напрямую в вашем приложении, то есть вероятность его зависания, в то время как будет выполняться запрос для стороннего сервиса.

6 ответов
Я считаю себя хорошо подготовленным разработчиком шаблонов WordPress, и недавно я начал читать книги и документы о веб-приложениях, особенно Django и Ruby on Rails. Я не знал ни одного из двух языков, но у меня нет проблем, чтобы узнать еще один или два. Я действительно не получаю реальных преимущес...
wordpress-theming
frameworks
13 дек. 2012, в 13:13
6 ответов
Я хотел бы просмотреть данные в моей БД при разработке с помощью Rails (фактически во всех трех из них разработка, тестирование и производство). Я не касался конфигураций, поэтому это должно быть легко, но я не смог найти полезную информацию. Я понятия не имею, что такое строка подключения или где е...
ruby-on-rails-3
aptana
16 апр. 2012, в 08:30
22 ответа
Я не понимаю, как Twitter Bootstrap делает активные ссылки для навигации. Если у меня есть регулярная навигация, подобная этой (с привязкой ruby ​​on rails): <ul class="nav"> <li class="active"> <a href="/link">Link</a> </li> <li class=""> <a href="/link"&g...
26 март 2012, в 22:18
11 ответов
Я использую материал Twitter Bootstrap, и у меня есть следующий HTML: <a class="btn" href="<%= user_path(@user) %>"><i class="icon-ok icon-white"></i> Do it@</a> Какой лучший способ сделать это в Rails? Я хотел бы использовать <%= link_to 'Do it', user_path(@user) %...
22 фев. 2012, в 19:35
3 ответа
В своем действии я хочу отвечать только обработкой, если он был вызван из запроса AJAX. Как я могу проверить? Я хочу сделать что-то вроде этого: def action @model = Model.find(params[:id]) respond_to do |format| if (wasAJAXRequest()) #How do I do this? format.html #action.htm...
22 нояб. 2011, в 01:19
13 ответов
У меня есть приложение rails, что базы данных находятся в SQLite (Dev и production). Поскольку я перехожу к heroku, я хочу преобразовать свою базу данных в PostgreSQL. В любом случае, я слышал, что локальная база разработки не нуждается в изменении от SQLite, поэтому мне не нужно ее менять, однако, ...
database
heroku
15 июль 2011, в 16:47
4 ответа
Я создаю приложение rails, которое я буду размещать на Heroku на domain.com. И я бы хотел использовать WordPress для блога, размещенного на phpfog, но я не хочу использовать подобный поддомен, например blog.domain.com. Вместо этого я предпочитаю использовать подкаталог, например domain.com/blog Не о...
heroku
subdomain
subdirectories
30 май 2011, в 18:44
5 ответов
Я пытаюсь добавить уникальный индекс, который создается из внешних ключей из четырех связанных таблиц (пользователей, университетов, subject_names, subject_types): add_index :studies, ["user_id", "university_id", \ "subject_name_id", "subject_type_id"], :unique => true Ограни...
migration
indexing
26 март 2011, в 16:02
5 ответов
Мне нужно изменить тип столбца с даты на дату-время для приложения, которое я создаю. Мне все равно, что данные все еще разрабатываются. Как я могу это сделать?
migration
ruby-on-rails-3
04 март 2011, в 06:37
4 ответа
Каковы альтернативы Wordpress для Ruby on Rails? Как они сравниваются с Wordpress?
content-management-system
07 янв. 2011, в 16:36
23 ответа
Я боролся с этим в течение некоторого времени. Я установил Rails 3, gem, mysql на свою машину Snow Leopard. Все шло хорошо, пока я не создал свой первый проект и не попытался запустить rails server После запуска я получаю: jontybrook$ rails server /Library/Ruby/Gems/1.8/gems/mysql2-0.2.6/lib/mysql2...
rubygems
webrick
28 дек. 2010, в 14:08
6 ответов
Я пытаюсь развернуть свое первое приложение в Heroku. Я использую Sqlite как базу данных. Насколько я знаю, Heroku не использует Sqlite - он переключается на Postgres в бэкэнд. При развертывании я получаю следующую ошибку: /usr/ruby1.8.7/lib/ruby/gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:6...
sqlite3
deployment
heroku
09 окт. 2010, в 18:58
23 ответа
У меня возникают проблемы при установке mysql2 gem для Rails. Когда я пытаюсь установить его, запустив bundle install или gem install mysql2, он вызывает следующую ошибку: Ошибка при установке mysql2: ERROR: Не удалось создать собственное расширение gem. Как я могу исправить это и успешно установи...
31 авг. 2010, в 11:14
12 ответов
Я пытаюсь установить драгоценный камень SQLite на коробке Fedora 9 Linux с Ruby 1.8.6, Rails 2.2.2, gem 1.3 и sqlite-3.5.9. Вот команда, которую я запускаю, и ее результаты: sudo gem install sqlite3-ruby Building native extensions. This could take a while... ERROR: Error installing sqlite3-ruby: ...
07 янв. 2009, в 17:12
16 ответов
Запуск сайта rails прямо сейчас с помощью SQLite3. Примерно каждые 500 запросов или около того я получаю ActiveRecord:: StatementInvalid (SQLite3:: BusyException: база данных заблокирована:... Какой способ исправить это, что будет минимально инвазивным для моего кода? Я использую SQLLite на данный м...
17 сен. 2008, в 00:42
Наверх
Меню