Папярэдні занятак

Rails new

Шмат Вы ўжо натрываліся! Кансольныя праграмы напэўна ўжо досыць надакучылі. Ну ўсё, падрыхтуйцеся! З тымі ведамі, якія Вы ўжо маеце будзе вельмі проста пабудаваць сапраўднае Вэб-прыкладаньне. Пагналі!

Усталюйце гем, які завецца rails. Потым надрукуйце $ rails new contacts і цісніце Энтэр.

Блін колькі тэчкаў стварылася! Але з блізкага погляду шмат чаго выглядае знаёмым. Ёсьць файл readme, Rakefile, Gemfile і Gemfile.lock, таксама .gitignore. Каб даць магчымасьць карыстальнікам Вашага прыкладаньня карыстацца ім з браўзера нам патрэбен сэрвер; config.ru выкарыстоўваецца сэрверам каб запусьціць Вашае прыкладаньне. Зараз наконт тэчак:

  • app: Вашыя мадэлі жывуць у тэчцы models у тэчцы app. Кантролеры выкарыстоўваюцца каб адпрацоўваць запыты да прыкладаньня. Мэілеры мы ня будзем выкарыстоўваць, але яны патрэбны для дасыланьня пошты.
  • app/assets Мае падтэчкі для javascript, css і малюнкаў.
  • app/helpers Для класаў з мэтадамі, якія дапамагаюць адлюстроўваць інфармацыю на старонках.
  • app/views Месца для нашых html файлаў – само вэб-прыкладаньне.
  • config: Тое што раней было db/config.yml зараз config/database.yml. Плюс яшчэ некалькі канфігурацыйных файлаў.
  • db: Гэтая тэчка будзе трымаць Вашу базу дадзеных і яе схему. Пра seeds.rb пачытайце ў самім файле.
  • lib: Тэчка для дадатковых бібліятэк, якія Вы магчыма будзеце выкарыстоўваць у прыкладаньні.
  • log: Вэб-сэрвер будзе захоўваць логі тут.
  • public: Статычныя файлы, якія не створаны Вашым прыкладаньнем мусяць быць тут.
  • script: Rails дае магчымасьць выклікаць заданьні накшталт запуску сэрвера. Яны знаходзяцца тут.
  • tmp: Часовыя файлы.

З першага погляду ўсё выглядае трохі складана, але мы як заўсёды здолеем разабрацца.

Міграцыі Rails

Давайце створым табліцу contacts для нашых кантактаў. Выканайце:

  • rails generate migration create_contacts

Раней мы выкарыстоўвалі $ rake db:new_migration name=create_contacts, але гэта былі міграцыі Standalone Migrations. Зараз напішам нашую міграцыю:

class CreateContacts < ActiveRecord::Migration
  def change
    create_table :contacts do |t|
      t.column :name, :string
      t.column :phone, :string
      t.column :email, :string

      t.timestamps
    end
  end
end

Мігруйце Вашу базу дадзеных і стварыце рэалізацыю класа Contact як і рабілі раней.

Rails кансоль

Перад тым як рухацца далей, давайце разглядзім вельмі клёвую рэч - кансоль Rails. Выканайце $ rails console і Вы атрымаеце irb-кансоль з загружаным асяродзьдзем Rails. Паспрабуйце знаёмыя каманды Ruby і Active Record накшталт > Contact.first. Кансоль Rails можа быць вельмі карыснай тады, калі трэба атладжваць Вашае прыкладаньне або зьмяняць дадзеныя ў час выканьня.

Маршруты Rails

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

Першае што мы зробім - гэта скажам Rails што рабіць калі ён атрымлівае GET запыт на /contacts. Мы хочам каб гэты запыт адпрацоўваўся ContactsController, таму стварыце файл у тэчцы app/controllers з назвай contacts_controller.rb які выглядае вось так:

class ContactsController < ApplicationController
end

Кантролер - гэта такая штука, якая адпрацоўвае вонкавыя запыты да сэрвера.

Зараз распавядзем Rails КУДЫ яму накіроўваць запыт, які прыходзіць на урл /contacts. Адчыніце config/routes.rb і надрукуйце:

Wikipages::Application.routes.draw do
  match 'contacts' => 'contacts#index', :via => :get
end

Напэўна зразумела што атрымліваецца. Кожны запыт які прыходзіць на урл /contacts дасылаецца ў мэтад index класа ContactsController.

Рэалізуем яго:

class ContactsController < ApplicationController
  def index
  end
end

Сэрвер Rails

Пісаць код канешне файна, але давайце запусьцім сапраўдны сэрвак. У кансолі надрукуйце $ rails server, або проста $ rails s. Вы павінны бачыць нешта такое:

=> Booting WEBrick
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-01-16 13:55:21] INFO  WEBrick 1.3.1
[2013-01-16 13:55:21] INFO  ruby 1.9.3 (2012-10-12) [x86_64-darwin12.2.0]
[2013-01-16 13:55:21] INFO  WEBrick::HTTPServer#start: pid=8814 port=3000

WEBrick - гэта сэрвер уключаны ў стандартную бібліятэку Ruby. Каб зрабіць Ваш першы запыт да Вашага першага Rails вэб прыкладаньня ў адрасным радку браўзэра надрукуйце http://localhost:3000/. Вось і наш сервак. Але гэта вядома не кантакты. Каб праглядзець сьпіс кантактаў ідзем на http://localhost:3000/contacts.

Натуральна памылка! Дзесьці такая: Template is missing. Гэтая памылка значыць што Rails шукае файл index.html.erb, які мусіць адлюстроўваць старонку, у тэчцы app/views/contacts, але яго там няма. Таму нам трэба яго стварыць. Успамінаем пра HTML і ствараем наш першы тэставы view. Завем яго index.html.erb і кладзем у тэчку app/views/contacts пакуль пустым.

Глядзім зараз.

Ну вось. Ужо лепей. Прынамсі памылкаў няма. Можаце дадаць туды якое-небудзь слова, якое падабаецца, або лепей html. Адлюструецца :)

View

Віншую! Вы толькі што стварылі Ваш першы Rails view.

Давайце пераўтварым наша index view у табліцу, якая будзе адлюстроўваць кантакты з базы дадзеных. Вось html:

<h2>Contacts</h2>

<h2>A user-contributed phone (and email) book.</h2>

<table>
  <tr>
    <td>Name</td>
    <td>Phone</td>
    <td>Email</td>
  </tr>
  <% @contacts.each do |contact| %>
    <tr>
      <td><%= contact.name %></td>
      <td><%= contact.phone %></td>
      <td><%= contact.email %></td>
    </tr>
  <% end %>
</table>

Трошкі тлумачэньня. Усё што знаходзіцца паміж <%= %> выконваецца як код Ruby а вынік адлюстроўваецца ў старонку. Вось чаму назвы нашых вью скончваюцца на erb, што значыць Embedded Ruby. Таму ўсё што мае зьменная contact мы друкуем на старонку.

Усё што знаходзіцца паміж < %> таксама інтэрпрэтуецца як код Ruby, але вынік нікуды не друкуецца. Карасна для цыклаў, if-канструкцыяў і г.д.

І дадаем кантролер:

class ContactsController < ApplicationController
  def index
    @contacts = Contact.all
  end
end

Падаецца ўсё. Спрабуем! Атрымалася. Але пуста, бо няма дадзеных у базе дадзеных. Дадайце трошкі мадэляў праз кансоль, але не забудзьцеся дадаць attr_accessible :name, :email, :phone у мадэль, каб мець магчымасьць зьмяняць уласьцівасьці.

Калі забыліся, вось Вам падказка - Contact.create(:name => 'Alies', :phone => '123', :email => 'alies@example.com')

Вы напэўна заўважылі, што калі Вы ідзёцу на http://localhost:3000/, Вы атрымліваеца старонку "Welcome to Rails". Яна загружаецца з файла public/index.html. Давайце заменім яго нашай старонкай contacts/index. Дадайце наступную лінію апошняй ў файл з маршрутамі:

root :to => 'contacts#index'

Потым, выдаліце public/index.html і app/assets/images/rails.png. Зараз, галоўнай старонкай Вашага сайту будзе contacts/index.

Даданьне мадэляў

Зараз давайце створым яшчэ адзін вью new каб адлюстроўваць форму для стварэньня кантакта. Створым новы файл new.erb.html, які будзе дасылаць POST-запыт у мэтад create кантролера. Вось html:

<h2>New contact</h2>

<form action="/contacts" method="post">
  <label>Name</label>
  <input name="contact[name]" />
  <label>Phone</label>
  <input name="contact[phone]" />
  <label>Email</label>
  <input name="contact[email]" />
  <input name="commit" type="submit" value="Save" />
</form>

Звярніце ўвагу на тое, як input-палі напісаны ў выглядзе хэша (contact[name]). Так Rails разумее як будаваць хэш params у кантролеры.

Не забудзьцеся дадаць новы маршрут у routes.rb match 'contacts/new' => 'contacts#new', :via => :get.

Абнавінце старонку й Вы ўбачыце што маеце форму, гатовую працаваць. Цісніце Save і Вы атрымаеце памылку Routing Error. No route matches [POST] "/contacts". Напэўна забыліся дадаць маршрут для POST запыта. Дадайце яго match 'contacts' => 'contacts#create', :via => :post. А зараз час пабудаваць сам мэтад create, які будзе адпрацоўваць POST запыты.

class ContactsController < ApplicationController
  def create
    Contact.create(params[:contact])
    redirect_to '/contacts'
  end
end

Атрымалася? Выдатна! Зараз зрабіце так, каб было немагчыма стварыць пусты кантакт.

Наступны занятак