Опубликован: 27.01.2016 | Доступ: свободный | Студентов: 914 / 58 | Длительность: 23:07:00
Лекция 3:

В основном статические страницы

Заключение

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

Прежде чем двигаться дальше, давайте потратим минуту, чтобы закоммитить наши изменения и объединить их с мастер веткой. Еще в Разделе 3.1 мы создали в Git ветку для разработки статических страниц. Если вы не делали коммиты во время чтения, сначала сделайте коммит указывающий что мы достигли точки остановки:

$ git add .
$ git commit -m "Finish static pages"

Затем объедините изменения с мастер веткой, используя ту же технику, что и в Разделе 1.3.5:

$ git checkout master
$ git merge static-pages

Как только вы достигаете точки остановки, такой как эта, обычно это хорошая идея, чтобы отправить (to push) ваш код в удаленное хранилище (которым, если вы следовали шагам в Разделе 1.3.4, будет GitHub):

$ git push

Если вы хотите, в этот момент вы даже можете развернуть обновленное приложение на Heroku:

$ git push heroku

Упражнения

  1. Создайте страницу Contact для примера приложения. Следуя модели в Листинге 3.19, сначала напишите тесты на существовани страницы по URL /static_pages/contact которые проверяют правильность тайтла "Ruby on Rails Tutorial Sample App | Contact". Добейтесь прохождения тестов и затем заполните страницу Contact содержимым из Листинга 3.30. (Решение этого упражнения является частью Раздела 5.3.)
  2. Вы могли заметить некоторые повторения в спеке StaticPages контроллера (Листинг 3.19). В частности, базовый заголовок, "Ruby on Rails Tutorial Sample App" одинаков для каждого теста заголовка. Используя RSpec функцию let которая создает переменную соответствующую ее аргументу, проверьте что тесты в Листинге 3.31 все еще проходят. Листинг 3.31 вводит интерполяцию строк о которой будет рассказано в Разделе 4.2.2.
  3. (продвинутое) Как отмечается в Heroku page on using sqlite3 for development, хорошей идеей является использование одинаковой базы данных в девелопмент, тест и продакшн окружениях для минимизации возможных несовместимостей. Следуя инструкциям Heroku по локальной установке PostgreSQL установите базу данных PostgreSQL на вашу систему. Обновите ваш Gemfile как показано в Листинге 3.32 для устранения гема sqlite3 и использования только pg гема. Вам также следует разузнать о файле config/database.yml и локальном запуске PostgreSQL. (Обратите внимание - для обеспечения безопасности вам следует добавить database.yml в ваш файл .gitignore, как это показано в Листинге 1.7.) Вашей целью должно быть создание и конфигурирование девелопмент и тестовой баз данных для использования PostgreSQL. Я особенно рекомендую использовать Induction для подключения и просмотра локальной PostgreSQL базы данных. Предупреждение: Это упражнение является очень сложным и я рекомендую его только для продвинутых пользователей. Если вы застрянете, не стесняйтесь пропустить это упражнение. И не переживайте — как было отмечено ранее, пример приложения разрабатываемый в этом учебнике полностью совместим как со SQLite так и с PostgreSQL.
<% provide(:title, 'Contact') %>
<h1>Contact</h1>
<p>
  Contact Ruby on Rails Tutorial about the sample app at the
  <a href="http://railstutorial.org/contact">contact page</a>.
</p>
Листинг 3.30. Код для предложенной страницы Contact. app/views/static_pages/contact.html.erb
require 'spec_helper'

describe "Static pages" do

  let(:base_title) { "Ruby on Rails Tutorial Sample App" }

  describe "Home page" do

    it "should have the content 'Sample App'" do
      visit '/static_pages/home'
      expect(page).to have_content('Sample App')
    end

    it "should have the title 'Home'" do
      visit '/static_pages/home'
      expect(page).to have_title("#{base_title} | Home")
    end
  end

  describe "Help page" do

    it "should have the content 'Help'" do
      visit '/static_pages/help'
      expect(page).to have_content('Help')
    end

    it "should have the title 'Help'" do
      visit '/static_pages/help'
      expect(page).to have_title("#{base_title} | Help")
    end
  end

  describe "About page" do

    it "should have the content 'About Us'" do
      visit '/static_pages/about'
      expect(page).to have_content('About Us')
    end

    it "should have the title 'About Us'" do
      visit '/static_pages/about'
      expect(page).to have_title("#{base_title} | About Us")
    end
  end

  describe "Contact page" do

    it "should have the content 'Contact'" do
      visit '/static_pages/contact'
      expect(page).to have_content('Contact')
    end

    it "should have the title 'Contact'" do
      visit '/static_pages/contact'
      expect(page).to have_title("#{base_title} | Contact")
    end
  end
end
Листинг 3.31. Спек StaticPages контроллера с базовым заголовком. spec/requests/static_pages_spec.rb
source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.2'
gem 'pg', '0.15.1'

group :development, :test do
  gem 'rspec-rails', '2.13.1'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
end

gem 'sass-rails', '4.0.1'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end
Листинг 3.32. Gemfile необходимый для использования PostgreSQL вместо SQLite.

Продвинутые настройки

Как упоминалось в Разделе 3.2, непосредственное использование команды rspec не лишено недостатков. В этом разделе мы вначале обсудим способ устранения необходимости каждый раз набирать bundle exec, а затем настроим установку тестов для автоматизации запуска набора тестов с помошью Guard (Раздел 3.6.2) и, опционально, Spork (Раздел 3.6.3). Наконец мы упомянем о способе запуска тестов непосредственно внутри Sublime Text - технике, особенно полезной в паре со Spork.

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

Избавляемся от bundle exec

Как было вкратце отмечено в Разделе 3.2.1, зачастую необходимо предварять такие команды как rake или rspec командой bundle exec для того чтобы программы запускались с набором гемов прописанных в вашем Gemfile. (По техническим причинам единственным исключением является сама команда rails.) Такая практика является довольно громоздкой и в этом разделе мы обсудим два способа устранения этой необходимости.

RVM Bundler интеграция

Первый и наиболее предпочтительный метод заключается в использовании RVM, который включает интеграцию с Bundler начиная с версии 1.11. Вы можете проверить что у вас достаточно свежая версия RVM следующим образом:

$ rvm get stable
$ rvm -v

rvm 1.19.5 (stable)

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

$ rspec spec/

опуская bundle exec. Если это ваш случай, вам следует пропустить остальную часть этого раздела.

Если вы по каким-либо причинам ограничены более ранней версией RVM, вы все же можете избежать bundle exec с помощью RVM Bundler интеграции12http://rvm.io/integration/bundler/ для конфигурирования Менеджера Версий Руби таким образом чтобы он в локальном окружении включал правильные программы автоматически. Шаги просты, хотя и немного загадочны. Для начала, выполните эти две команды:

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler

Затем выполните эти:

$ cd ~/rails_projects/sample_app
$ bundle install --without production --binstubs=./bundler_stubs

Эти команды комбинируют магию RVM и Bundler с тем чтобы обеспечить выполнение таких команд как rake или rspec в правильном окружении. Поскольку эти файлы специфичны для вашей локальной настройки, вы должны добавить bundler_stubs директорию в ваш .gitignore файл (Листинг 3.33).

# Игнорирование конфига bundler
/.bundle

# Игнорирование дефолтной базы данных SQLite.
/db/*.sqlite3
/db/*.sqlite3-journal

# Игнорирование всех логов и временных файлова.
/log/*.log
/tmp

# Игнорирование прочих ненужных файлов.
doc/
*.swp
*~
.project
.DS_Store
.idea
bundler_stubs/
Листинг 3.33. Добавление bundler_stubs в .gitignore файл.

При добавлении другой исполняемой задачи (такой как guard в Разделе 3.6.2), вам нужно перезапустить команду bundle install:

$ bundle --binstubs=./bundler_stubs

binstubs

Если вы не используете RVM, вы все же можете избежать набора bundle exec с помощью гема rubygems-bundler:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

Эта команда создает все необходимые исполняемые файлы локально, таким образом что мы теперь можем запускать набор тестов следующим образом:

$ rspec spec/

Аналогично для rake, и т.д.:

$ rake db:migrate

При добавлении другой исполняемой задачи (такой как guard в Разделе 3.6.2), вам возможно придется перезапустить gem regenerate_binstubs. (Все должно работать нормально и без этого, я упомянул эту возможность просто на всякий случай.)

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

Вадим Обозин
Вадим Обозин

Здравствуйте, записался на курс. При этом ставил галочку на "обучаться с тьютором". На email пришло письмо, о том, что записался на самостоятельное изучение курса. Как выбрать тьютора?