Skip to content

Latest commit

 

History

History
256 lines (183 loc) · 16.6 KB

2_lecture.md

File metadata and controls

256 lines (183 loc) · 16.6 KB

2. Асновы працы і архітэктуры Rails прыкладання. MVC. Разгортванне на Heroku

Структура Rails application

На мінулым занятку мы стварылі стандартны каркас Rails прыкладання. Давайце падрабязней пазнаёмімся са структурай. Большая частка працы падчас распрацоўкі будзе з файламі каталога app/, але варта пазнаёміцца і з астатнімі файламі і дырэкторыямі, каб лепей разумець, як працуе Rails application.

app

app/assets/ змяшчае рэсурсы вашага прыкладання: выявы, файлы JavaScript і стылі CSS.

app/models/, app/views/, app/controllers/ - код вашых мадэляў, прадстаўленняў і кантроллераў. Пра Model-Views-Controllers чытайце ніжэй.

app/helpers/ - тут прынята змяшчаць модулі з дапаможнымі метадамі для прадстаўленняў вашага прыкладання. Па першае, гэта дае магчымасць разгрузіць views ад логікі і складанай рэалізацыі, па другое, гэта дазваляе пазбегнуць паўтораў у кодзе.

bin

bin/ захоўвае бінарныя скрыпты, якія выконваюць запуск прыкладння і іншыя задачы (наладка, deploy, rake). Сюды можна дадаваць і свае сцэнары для каманднага радка.

config

config/ змяшчае ўсе наладкі вашага прыкладання і кампанентаў Rails. Тут можна сканфігураваць асяроддзі распрацоўкі (config/environments/), альбо зрабіць агульныя для ўсіх асяроддзяў канфігурацыі (application.rb). Таксама тут змяшчаюцца канфігі базы дадзеных і іншыя (assets, middleware, генератары, лакалізацыя, разгортванне). Звярніце увагу на каталог config/initializers/ - тут змешчаны ініцыялізатары. Гэта Ruby-файлы, код якіх выконваецца пасля загрузкі фрэймўорка і гемаў. З файлам config/routes.rb/ пазнаёмімся крыху пазней.

Я ўжо адзначаў, што па змоўчванні Rails прыкладанне сканфігураванна адпаведна разумным пагаджэнням. Вы можаце ў гэтым запэўніцца, калі паглядзіце колькі ўжо канфігурацыйных файлаў і дырэкторый было створана ў каталоге app/config/, калі мы згенеравалі прыкладанне. Ткім чынам пачатковая канфігурацыя ўжо зроблена для вас. Тым не менш, вы заўсёды можаце змяніць пэўныя наладкі адпаведна сваім канкрэтным задачам. Больш падрабязна з канфігурацыяй Rails прыкладанняў можна у Rails Guides.

db

db - тут захоўваюцца файлы базы дадзеных: міграцыі, seed-файлы, схема базы.

lib і vendor

lib/ - знешнія модулі для прыкладання, vendor/ - код пабочных распрацоўшчыкаў (бібліятэкі, плагіны, рэсурсы).

log і tmp

log/ - логі прыкладання, tmp/ - часовыя файлы. Не забывайце дадаваць гэтыя каталогі у .gitignore

public

public/ - гэта адзіная дырэкторыя, якая даступная знешне, таму трэба быць асцярожным і ўзважваць размяшчэнне і доступ да файлаў гэтага каталога. Тут звычайна захоўваюцца статычныя файлы (старонкі памылак, мапа сайта і г.д).

Іншыя файлы і каталогі

test/ - тут месцяцца тэсты для Rails прыкладання. config.ru - канфігурацыя для Rack middleware. Rakefile - службовыя rake-каманды, якія можна запускаць з тэрмінала. README.rdoc - мануал і дакументацыя для вашага прыкладання. Я рэкамендую змяшчаць тут інструкцыі па наладцы вашага прыкладання ці мануал па запуску нейкіх спецыфічных задач. Добрая дакументацыя дазволіць сэканоміць шмат часу вам і вашым калегам. Звярніце увагу, што Github паказвае змесціва Readme, калі зайсці на старонку рэпазіторыя. З .gitignore, Gemfile і Gemfile.lock мы пазнаёміліся на мінулым занятку.

Model-View-Controller

Агляд MVC

Канцэпцыя Model-View-Controller была апісана яшчэ у 1979 годзе, падчас працы над мовай Smalltalk. Варта заўважыць, што мова Ruby і фрэймўорк Rails ўвабралі ў сябе шмат добрых рэчаў з іншых тэхналогій. Паглядзіце на выдатную інфаграфіку, якая паказвае ўзаемасувязі паміж Ruby і іншымі мовамі праграмавання.

MVC - гэта архітэктура прыкладання, адпаведна якой адбываецца падзяленне логікі прыкладання на тры кампаненты:

  • Model - бізнэс-логіка.
  • View - логіка прадстаўлення даступная карыстальніку у графічным выглядзе
  • Controller - логіка самаго прыкладання

Што гэта азначае ў кантэксце Ruby on Rails? У Rails ёсць чоткае падзяленне на кампаненты MVC.

Мадэлі Rails - гэта класы Ruby, якія адказваюць за дадзеныя, прадстаўленне, валідацыю, актуальнасць і апрацоўку дадзеных, а таксама ўзаемасувязі паміж дадзенымі. Мадэлі камунікуюць з БД праз сродкі Active Record.

Views (прадстаўленні) - гэта шаблоны, якія адказваюць за візуалізацыю. У канечным выглядзе яны канвертуюцца ў HTML старонкі.

Кантроллеры ўзаемадзейнічаюць з мадэлямі. Таксама кантроллеры апрацоўваюць запыты карыстальнікаў і вяртаюць адказ ў выглядзе статычнай вэб старонкі, альбо (пасля выкліка мадэлі) - вяртаюць прадстаўленне з візуялізаванымі дадзенымі.

Ствараем статычныя старонкі

Зараз мы паглядзім на практыцы, як рэалізавана MVC у Rails. Для гэтага мы створым Pages кантроллер і дададзім некалькі статычных старонак.

Генеруем кантроллер (Pages - гэта назва кантроллера, home і course - гэта назвы actions (дзеянняў):

$ rails generate controller Pages home course

Акрамя уласна файла кантроллера каманда rails generate стварае заглушкі для скрыптаў, стыляў, тэстаў і хэлпераў. Таксама дадаецца шаблон і абнаўляюцца маршруты.

Адчыніце ў браўзеры http://0.0.0.0:3000/pages/home - гэта старонка, якую мы толькі што згенеравалі. Давайце зробім яе галоўнай старонкай. Для гэтага трэба дадаць карнявы маршрут:

# config/routes.rb
root  'pages#home'

Радок get 'pages/home' цяпер можна выдаліць. За перадачу запытаў ад кліента да нашага прыкладання адказвае Rails router. Давайце расшыфруем радок root 'pages#home'. Мы толькі што сказалі роўтэру, як паступаць з запытам да кораня (root) нашага прыкладання - http://0.0.0.0:3000/ . Роўтэр накіроўвае гэты запыт да дзеянне home кантроллера pages. Але паглядзіце файл нашага кантроллера: дзеянне home пустое. Давайце дададзім крыху дадзеных:

# app/controllers/pages_controller.rb
def home
    @hello = 'Hi there!'
end

Мы толькі што стварылі зменную экземпляра @hello і далі ёй значэнне радка Hi there!. Радкі у Ruby змяшчаюцца ў апострафах. Давайце перададзім значэнне зменнай на нашу home старонку:

# app/views/pages/home.html.erb
<h1><%= @hello %></h1>

Звярніце ўвагу, што файл View мае фармат html.erb. erb - гэта Embedded Ruby, фільтр, які дазваляе выконваць код Ruby ў нашых прадстаўленнях. Ў erb-файлах код, які выконваецца і вынік якога мусіць быць адлюстраваны змяшчаецца ў канструкцыі <%= %>. Сюды мы і запіхалі нашу зменную.

Акрамя home action мы маем таксама course. Гэта дзеянне выклікаецца пры запыце http://0.0.0.0:3000/pages/course. Давайце спрасцім запыт, для гэтага зменім стары маршрут на іменаваны:

# config/routes.rb
get 'course' => 'pages#course'

Што гэта значыць? Мы далі імя course для нашага дзеяння course кантроллера pages. Зараз гэта дзеянне можна выклікаць такім чынам: http://0.0.0.0:3000/course

Давайце створым яшчэ адну старонку - для водгукаў на нашым будучым сайце:

# app/views/pages/testimonials.html.erb
<h1>Testimonials</h1>

Калі адразу паспрабаваць адчыніць яе http://0.0.0.0:3000/pages/testimonials - мы атрымаем памылку ActionController::RoutingError (No route matches [GET] "/pages/testimonials"). Заўсёды ўважліва глядзіце на памылкі - яны нясуць вельмі шмат карыснай інфы. Зараз адразу зразумела, што трэба дадаць маршрут для кантроллера Pages:

# config/routes.rb
get 'pages/testimonials'

Але гэта яшчэ не ўсё , бо трэба стварыць action:

# app/controllers/pages_controller.rb
def testimonials
end

Зараз ўсё працуе!

MVC у нашым прыкладанні

Давайце паглядзім, як працуе наша прыкладанне у кантэксце MVC. Мы зараз абстрагуемся ад web-сервера і middleware, нас цікавіць толькі праца нашага прыкладання. Паглядзіце на схему:

rails-mvc

Што адбываецца, калі мы робім запыт на URL /pages/testimonials ? Rails роўтэр апрацоўвае URL нашага запыта і накіроўвае да дзеяння testimonials кантроллера Pages. View візуалізуе старонку HTML. Пасля гэтага кантроллер адразу вяртае нам web-старонку. Гэта найпрасцейшы выпадак, бо няма ніякага ўзаемадзеяння з мадэлью і базай дадзеных. Але ўсё па парадку. З Rails models мы будзем разбірацца на наступных занятках. Калі разглядзець запыт да URL /, розніца будзе толькі ў тым, што кантроллер перадасць зменную @hello у action home.

Разгортванне на Heroku

Мы ўжо маем мінімальна працоўнае web-прыкладанне і ажно тры статычныя старонкі. Гэта значыць, што можна разгарнуць нашае прыкладанне на сервер. Для гэтага мы скарыстаемся цудоўным воблачным сервісам Heroku. Трэба на ім зарэгістравацца.

Я рэкамендую як мага раней прыступаць да разгортвання прыкладання, бо тады можна з самага пачатку убачыць праблемы і задачы, спецыфічныя для вашага production асяроддзя на канкрэтным серверы.

Усё што трэба, каб пачаць працу з Heroku - гэта усталяваць кліента каманднага радка і крыху падрыхтаваць Rails application.

Абнаўляем Gemfile. Дадаем (пакуль што толькі ў групу production) gem pg для базы дадзеных Postgresql і выносім sqlite3 ў групу development. Пазней мы навучымся канфігураваць базы дадзеных і працаваць з імі. Зараз нам гэта не трэба, бо Heroku робіць гэта за нас. Таксама трэба дадаць gem rails_12factor - ён патрэбны для апрацоўкі статычных рэсурсаў.

# Gemfile

group :production do
  # Use postgresql as the database for Active Record
  gem 'pg'
  #Heroku integration
  gem 'rails_12factor'
end

group :development do
  gem 'sqlite3'
end

Усталёваем гемы з флагам without production (на лакальнай машыне яны нам не патрэбны):

$ bundle install --without production

Калі вы раптам дадалі secrets.yml файл у ігнор, то спатрэбіцца неяк вырашаць перадачу ключоў на Heroku. Я рэкамендую карыстацца гемам heroku_secrets.

Не забудзьце зафіксаваць вашыя змянненні і адправіць на Github, перад тым як пачаць deploy.

Разгарнуць Rails прыкладанне нерэальна проста:

$ heroku login
$ heroku create course-app
$ git push heroku master

course-application у камандзе heroku create - гэта назва прыкладання. Назву пазначаць не абавязкова, Heroku калі трэба, згенеруе імя за вас.

Зусім нядаўна мы толькі стварылі наша прыкладанне, а зараз яно ўжо дасупна ў сеціве. Бачыце, як проста распрацоўваць на Rails? ;)

<< папярэдні занятак наступны занятак >>