Статьи

Ruby on Rails: взгляд на код

Ruby on Rails приобрел свою репутацию благодаря тому, что для написания типичных задач веб-разработки требуется мало кода. Но как насчет кода, который вы должны написать? Со вчерашнего поста, в котором было объявлено о Ruby on Rails 1.0, многие люди задавались вопросом, каково это, когда вы преодолеваете ажиотаж.

Следующее переиздано из Tech Times # 128 .

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

В результате опыт изучения кода Ruby on Rails в первый раз может вызывать недоумение. «Откуда @posts переменная @posts и как она заполняется записями в базе данных?» — может возникнуть вопрос. Потому что у вас есть таблица базы данных, которая называется posts, и Rails подключает все это для вас.

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

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

 development: adapter: mysql database: jokes_development host: localhost username: username password: password test: ... production: ... 

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

Rails следует шаблону Model-View-Controller (MVC) в коде, который он генерирует. Поэтому приложение Rails состоит из объектов, основанных на записях базы данных ( модель ), веб-страницах для отображения и редактирования этих объектов ( представление ) и набора действий, которые связывают их вместе ( контроллер ).

Редактирование файлов модели позволяет вам контролировать, как записи извлекаются из базы данных. Допустим, вы хотите показывать только те шутки, которые были отмечены для публикации. Вы бы joke.rb файл joke.rb который определяет модель для шуток в базе данных:

 def self.published_jokes find(:all, :conditions => "published = 1") end 

Затем мы можем изменить действие по умолчанию (которое называется index ) в нашем контроллере списка шуток ( jokelist_controller.rb ), чтобы отобразить список опубликованных шуток вместо всех шуток (по умолчанию):

 def index @jokes = Joke.published_jokes end 

Мы также можем изменить нашу модель ( joke.rb ), чтобы установить некоторые требования (например, шутка должна содержать текст, и этот текст должен быть уникальным) для вновь созданных или обновленных шуток, которые отправляются через интерфейс администратора:

 class Joke < ActiveRecord::Base validates_presence_of :joketext validates_uniqueness_of :joketext def self.published_jokes find(:all, :conditions => "published = 1") end end 

Очень «говорящие вслух» звучащие имена, такие как validates_presence_of и validates_uniqueness_of , распространены в Ruby. Легко быть брошенным этим после краткости большинства других языков, но когда вы поймете, что в Ruby вы торгуете необходимостью запоминать сложный синтаксис файла конфигурации XML (распространенный в Java) для этих очень удобочитаемых имен, вы быстро адаптируетесь.

После того, как вы правильно поняли логику модели, вы захотите настроить веб-страницы, которые представляют модель пользователю (представление). В Rails вы обычно создаете страницы, используя простой язык шаблонов под названием Embedded Ruby (ERb). ERb позволяет вам создавать файлы .rhtml которые содержат встроенный код Ruby, но поскольку большая часть логики вашего приложения будет в модели и контроллере, код, .rhtml в ваших файлах .rhtml обычно ограничен короткими фрагментами, которые выводят динамические значения, или .rhtml наборы записей для вывода фрагмента HTML один раз для каждой записи.

Если в нашем шаблоне списка шуток ( index.rhtml ) мы хотим отображать только первые 20 символов каждой шутки, мы можем изменить код шаблона так, чтобы он выглядел следующим образом:

 <% for joke in @jokes %> <div class="joke"> <p> <%= h(truncate(joke.joketext, 20)) %> <%= link_to 'Read this joke', {:action => 'show_joke', :id => joke} %> </p> <p class="author> by <%= h(joke.author.full_name) %></p> </div> <% end %> 

Во-первых, этот код перебирает все шутки в коллекции, которую мы установили в нашем контроллере выше. Для каждой шутки выводятся первые 20 символов (с использованием встроенного метода truncate ), экранирование любых специальных символов HTML (с использованием встроенного метода h ). Затем он выводит гиперссылку с текстом «Читать эту шутку», которая будет ссылаться на другое действие Rails с именем show_joke , передавая ему идентификатор текущей шутки в строке запроса. Встроенный метод link_to упрощает создание таких ссылок.

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

 class Joke < ActiveRecord::Base belongs_to :author ... class Author < ActiveRecord::Base has_many :jokes ... 

Исходя из других языков, трудно поверить, что это весь код, который вам нужен для установки отношений между двумя классами на основе таблиц базы данных, но до тех пор, пока вы придерживаетесь author_id именования (таблица jokes в вашей базе данных должна иметь author_id поле, содержащее значения из поля id в таблице authors ), на котором основан Rails, все это работает!

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