Ruby on Rails: Instalacja i konfiguracja

Kontynuując poprzedni wpis wprowadzający do świata Ruby on Rails poruszymy dziś kwestię samej instalacji języka, frameworka oraz rozszerzeń oraz utworzymy pierwszą strukturę plików aplikacji w Ruby on Rails.

Nadmienię, że opisany przeze mnie proces instalacji podstawy Ruby odbywa się w środowisku linux (debian). Ponoć na Windowsie da się postawić Ruby + Rails ale są problemy z adapterem MySQL.

Przygotowanie systemu do instalacji

Na początek musimy przygotować nasz system, czyli zainstalować niezbędne nam pakiety (tutorial opisuję na bazie najnowszego stabilnego debiana – świeża instalacja). Na pewno będziemy potrzebowali curla do pobrania instalatora RVM – (Ruby Version Manager).

Procesu instalacji pakietów w Waszym linuksie chyba nie muszę opisywać 😉 używamy oczywiście odpowiedniego menadżera pakietów adekwatnie do posiadanej dystrybucji linuksa. Jeśli ktoś używający Mac OS X miałby problem to proszę pisać w komentarzach, pomogę w instalacji.

Z konta root (lub za pomocą sudo) wykonujemy polecenie:

Tak więc, zainstalowaliśmy podstawowe narzędzia do budowy oprogramowania, kompilatory, biblioteki, nagłówki kernela, curl oraz kilka dodatkowych narzędzi konsolowych takich jak: mc (wizualny manager plików do konsoli), vim (konsolowy edytor kodu), git (system kontroli wersji – przyda się wam jeśli zechcecie pobrać archiwum z opisywaną aplikacją z mojego Githuba).

Następnie instalujemy serwer baz danych MySQL. Celowo oddzieliłem to od poprzedniego zestawu programów by wszystko było jasne. Podczas instalacji zostaniemy poproszeni o wprowadzenie nowego hasła dla administratora. W moim przypadku będzie to developer – prawda, że nie do złamania? 🙂

Ze wstępnego przygotowania systemu to chyba wszystko. Przejdźmy do przygotowania bazy danych oraz instalacji samego języka, Ruby.

Instalacja Ruby

Na początek utwórzmy bazę danych do naszego projektu, niech się ona nazywa „webmastah”. Wpisujemy w konsoli poniższe, po czym wpisujemy wcześniej ustalone hasło.

Następnie tworzymy bazę danych:

Jeśli serwer zwróci: Query OK, 1 row affected to wychodzimy z serwera baz danych:

Baza została przygotowana, nie będę zagłębiał się w konsolowe zarządzanie użytkownikami bazy, bo do naszego tutoriala wystarczy użyć roota. Dla bardziej wymagających zachęcam do zapoznania się ze specyfikacją MySQL.

Są dwa sposoby na instalację Ruby, jednym z nich jest paczka z repozytorium dystrybucji lub menadżery wersji. My skupimy się na drugim rozwiązaniu ze względu na przestarzałe wersje pakietów w systemie. Za pomocą managera RVM będziemy mieli dostęp do każdej dostępnej wersji Ruby a co za tym idzie, Rails.

Aby zainstalować RVM oraz zainstalować najnowszą stabilną wersję Ruby wykonujemy poniższe polecenie. Wykonaj je z konta root aby zainstalować RVM globalnie, lub z konta użytkownika z użyciem sudo aby zainstalować RVM w środowisku użytkownika.

Teraz czekamy, aż system pobierze manager oraz wszelkie zależności (w przypadku instalacji z konta zwykłego użytkownika zostaniemy poproszeni o hasło). Instalator pobierze binarki Ruby oraz niezbędne, brakujące zależności a następnie wszystko zainstaluje.

Po skończonej instalacji Ruby, musimy dodać wpis do pliku .bashrc, który znajduje się w katalogu domowym.

To polecenie może różnić się w zależności od wybranego typu instalacji. Ja w tym tutorialu instalowałem RVM z poziomu użytkownika root. Poprawne polecenie adekwatne do instalacji zwróci nam RVM po skończonej instalacji Ruby, w ostatnim komunikacie rozpoczynającym się od * To start using RVM you need to run...

Tak więc edytujemy nasz plik .bashrc i wklejamy na koniec pliku wyżej wymienione polecenie.

Po poprawnej instalacji, wydajemy dla pewności polecenia

oraz

(Jeśli Ruby nie został zainstalowany, wydajemy polecenie rvm install ruby 2.0).
Jeśli zwróci nam zainstalowaną wersję RVM oraz Ruby (w moim przypadku: rvm 1.22.9 oraz ruby 2.0.0p247) oznacza to mały sukces 🙂

Instalacja Rails

Po poprawnej instalacji RVM oraz Ruby, czas na instalację samego frameworka – Rails. Zanim przejdziemy do instalacji, musimy wiedzieć czym jest GEM ponieważ Rails jest jednym z GEMów języka Ruby.

RubyGems jest menadżerem paczek oraz bibliotek języka Ruby, pozwalając nam dowolnie rozszerzać język wybierając interesujące nas paczki i biblioteki z globalnej bazy RubyGems zawierającej ponad 60 000 gotowych rozwiązań. Wspominam o tym bo RubyGems jest kluczową sprawą podczas programowania w Ruby on Rails. Dla pewności upewniamy się, czy gem został poprawnie zainstalowany.

U mnie: 2.0.3.

Jeśli wszystko jest w porządku instalujemy Railsy.

Chwilę to potrwa, w zależności od posiadanego sprzętu. Z racji, że opisuję instalację RoR w oparciu o maszynę wirtualną zajmie mi to na tyle czasu, że spokojnie mogę iść zaparzyć Yerba Mate 🙂

waiting

 

Po pewnym czasie otrzymujemy komunikat „28 gems installed”. Railsy zostały zainstalowane wraz z zależnościami i dokumentacją.

Sprawdzamy czy wszystko poszło po naszej myśli:

Jeśli zwraca Rails 4.0.0 oznacza, że tak.

Nasze narzędzie jest gotowe do pracy. Załóżmy folder w którym będzie docelowo nasz projekt.

Wejdźmy do niego i wygenerujmy nasz pierwszy szkielet aplikacji.

Your bundle is complete!

Właśnie utworzyliśmy w katalogu webmastah nasz pierwszy projekt w Ruby on Rails 🙂 Co prawda daleko jeszcze do tego by nazwać go projektem, ale szkielet już mamy. Podstawa do pracy gotowa. Mam nadzieję, że wszystkim instalacja poszła gładko.

Konfiguracja Rails

Po poprawnej instalacji Ruby oraz Rails, nadszedł czas na podstawową konfigurację naszego środowiska pracy.
Wchodzimy więc do katalogu gdzie wygenerowaliśmy nasz projekt „webmastah”.

Pierwszą rzeczą, którą musimy zrobić jest edycja pliku Gemfile zawierającego źródło Gemów oraz listę wymaganych przez aplikację paczek. Na końcu pliku dodajemy na początek dwa podstawowe gemy, bez których nie uruchomimy naszej aplikacji.

Wsparcie dla JavaScript. Użytkownikom Ubuntu ponoć pomaga instalacja nodejs.

Za pomocą naszego ulubionego edytora (używam vim ale nieznającym zalecam użycie mcedit) edytujemy plik Gemfile.

Dodajemy na końcu:

Po wszystkim (jak zawsze po edycji listy gemów) wykonujemy bundlera (manager gemów).

Dolewamy do Yerby gorącej wody z termosu i rozkoszujemy się chwilą wolnego czasu.

Your bundle is complete!

W fazie developerskiej nie będziemy instalować żadnego serwera wspomagającego Rails. Wystarczy nam wbudowany WEBrick. Uruchamiamy testowo naszą aplikację by upewnić się, że niczego nie brakuje. Wydajemy z konsoli polecenie będąc w katalogu projektu.

Jeśli serwer nie wyrzuca sterty błędów i widzimy adres pod, którym zobaczymy aplikację możemy uznać ten etap za zakończony.

Zrzut ekranu 2013-09-15 o 01.30.25

Jeśli uruchamiamy naszą aplikację na lokalnej maszynie (czyt. komputer na którym pracujemy), wystarczy wpisać w przeglądarce: http://127.0.0.1:3000, jeśli nie, to musimy wpisać adres IP serwera z portem 3000.

A tak wygląda początkowa strona naszego projektu. Renderowana bezpośrednio z katalogu Gems (nie nasza aplikacja).
Zrzut ekranu 2013-09-15 o 01.34.09

Sukces. Możemy zatrzymać nasz lokalny serwer WEBrick kombinacją ctrl + c.

Omówmy teraz podstawową strukturę drzewa plików naszej aplikacji w Ruby on Rails.
Składa się ona z 10 folderów:

  • app – główny katalog naszych klas, modeli, widoków
  • bin – katalog z plikami binarnymi, których używamy podczas pracy z RoR
  • config – pliki konfiguracyjne naszej aplikacji
  • db – katalog na bazę danych oraz wszelkie z nią związane migracje i seedy
  • lib – folder na zależne biblioteki, assetsy oraz zadania
  • log – standardowe miejsce gdzie znajdziemy logi naszej aplikacji
  • public – katalog publiczny, który wystawiony jest na „świat”. W nim właśnie będziemy umieszczać statyczne pliki naszej aplikacji (css, js, obrazy)
  • test – miejsce na wszelkiego rodzaju testy (np. jednostkowe)
  • tmp – w tym katalogu znajdują się tymczasowe pliki typu cache, pliki procesów, sesje, gniazda
  • vendor – rolą tego folderu, jak to zawsze z vendorami bywa, jest dostarczanie zewnętrznych narzędzi.

Utworzyliśmy wcześniej bazę danych prawda? Przydałoby się podłączyć do niej naszą aplikację. Potrzebujemy do tego specjalnego adaptera o nazwie mysql2, który oczywiście instalujemy z RubyGems. Edytujemy nasz plik Gemfile i dodajemy na końcu linię odpowiadającą adapterowi MySQL.

Nie zapominajmy o bundlerze 😉

Następnie przejdźmy do pliku konfiguracyjnego /config/database.yml

Do środowiska pracy „development” powinno używać się sqlite3 by nie przysparzać sobie problemów, ale my jesteśmy hardkorami i zaprzęgniemy MySQL 🙂

W sekcji development musimy nadpisać wszystko tak by wyglądało tak:

Uzupełniając oczywiście parametry konfiguracyjne własnymi danymi. U mnie baza danych nazywa się webmastah a hasło do niej to developer.

Wygenerujmy teraz nasz pierwszy kontroler, który będzie służył za wyjściowe przywitanie użytkownika (kontroler a ściślej jego akcja index będzie renderować widok z przywitaniem użytkownika po wejściu w główny adres naszej aplikacji).

Możemy użyć również skróconego zapisu: rails g controller Welcome index

W tej chwili został wygenerowany nasz pierwszy kontroler z jedną akcją index, którą podaliśmy jako drugi parametr generatora. Aby dodać więcej akcji podczas generowania kontrolera należy oddzielić spacją nazwy poszczególnych akcji.

Oto kod wygenerowane kontrolera /app/controllers/welcome_controller.rb

W pierwszej linii widzimy, że kontroler automatycznie dziedziczy po klasie ApplicationController. Wraz z kontrolerem został wygenerowany widok dla naszej akcji. Jeśli podalibyśmy jako parametry więcej akcji, dla każdej z nich generator stworzyłby pliki.
/app/views/welcome/index.html.erb

Ścieżka do widoku, analogicznie odzwierciedla strukturę kontrolera wraz z akcją. Generator tworzy w folderze widoków, katalog o nazwie kontrolera oraz pliki dla każdej z akcji z rozszerzeniem .html.erb.

Kontroler oraz widoki akcji zostały wygenerowane, czas na routing.

Przejdźmy do edycji pliku /config/routes.rb. Dla klarowności usuńmy jego zwartość i zastąpmy ją nastepującym kodem (będziemy sukcesywnie dodawać odpowiednie wpisy routingu).

Tym samym wskazaliśmy za pomocą routingu root nasz nowy kontroler oraz jego akcję index jako główne wywołanie.
welcome#index

Konkluzja

  • Zainstalowaliśmy interpreter Ruby, manager do zarządzania wersjami Ruby RVM (dla niewtajemniczonych: możemy na jednej maszynie bez problemu zestawić kilka wersji Ruby oraz odpowiadającym im wersji Railsow w formie wrapperów co pozwoli nam na pracę w projektach pisanych na różnych wersjach/zestawach),
  • zainstalowaliśmy serwer baz danych, utworzyliśmy naszą bazę oraz wskazaliśmy naszej aplikacji jak ma się komunikować z serwerem MySQL
  • wygenerowaliśmy nasz pierwszy kontroler oraz ustawiliśmy root w routingu.

Podsumowując nasza aplikacja jest gotowa do pracy 🙂 Teraz czas na całe „mięso” ale o tym w kolejnym wpisie. Musimy ustalić tylko jakiego typu aplikację chcecie abym kontynuował w kolejnych wpisach tej serii. Dla ułatwienia w komentarzach zaproponuję 4 typy, a Wy za pomocą strzałek (odpowiedniki „lubię to”) wybierzcie tą, nad którą będziemy pracować:

  • System zarządzania treścią (CMS)
  • System aktualności/bloga (Railsowy, okrojony WordPress)
  • Miniaturowe forum dyskusyjne (Działy, tematy, wpisy, użytkownicy)
  • Sklep Internetowy

Zapraszam również do śledzenia repozytorium z naszą aplikacją dostępną na Github.com oraz obserwowania mnie na Twitterze, Google+.

Programista, administrator - miłośnik nowych technologii. Jak każdy fachowiec w branży nie oprę się porannej kawie w towarzystwie świeżej prasy. Hobbystycznie fotografuję, psuję, naprawiam, lutuję. Czego nie lubię? Nieskromnych ludzi i brzydkiego kodu.

  • sbl

    System zarządzania treścią (CMS)

  • sbl

    System aktualności/bloga (Railsowy, okrojony WordPress)

  • sbl

    Miniaturowe forum dyskusyjne (Działy, tematy, wpisy, użytkownicy)

    • Przegra jednym głosem? :/

      • sbl

        I tak ankietę wezmę pod uwagę dnia, w którym siądę do pisania kolejnego wpisu. Więc zapewne się zmieni.

        • Konrad Krawczuk

          W ogóle nie widzę sensu pisania forum (nawet szkoleniowo). CMSa to taki zielony jak ja mógłby rozwijać i gdzieś użyć ale forum ?:D Jak często stawia się fora inne niż phpbb i inne „duże” ?:P Ewidentnie jestem za CMS 😛

          • sbl

            Nie mam pojęcia 🙂 Decyzje podejmują czytelnicy.
            CMS jest chyba przejedzonym tematem i każdy laik znający PHP dojdzie do napisania go w RoR. Natomiast napisanie silnika forum to już trochę zabawy i wiele osób chce poznać sposób.

  • sbl

    Sklep Internetowy

  • Rafał

    a kiedy można spodziewać się kolejnego dla kohany?

    • sbl

      Jeśli dobrze pójdzie to w ten piątek. Śledź mnie na Google+/Twitter to będziesz wiedział więcej 🙂

  • Szymon

    Podpowiedz jakiego edytora najlepiej używać 🙂

    • sbl

      Zależy co kto lubi. Ja używam RubyMine lub czasem Sublime Text.

      • Wszyscy polecają RubyMine, ale cena przeraża. A w 30 dni testowej wersji nie nauczymy się RoRa.
        Możesz polecić coś w miarę dobrego, ale darmowego?

  • dUh

    Temat umarł?

    • sbl

      Nie umarł 🙂 mam sporo na głowie ostatnio. Jak będę miał chwilę wolnego to napiszę, z resztą już zacząłem.

      • dUh

        Czekam z niecierpliwością. 😛

      • Anon

        Chyba jednak umarł…

  • marcin

    A co jesli po zainstalowaniu railsow mam:
    rails -v
    bash: rails: command not found???

    • marcin

      to bylo z konta roota, z normalnego uzytkownika pojawia się:

      marcin@UNKNOWN:~$ rails -v

      /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:250:in mkdir': Permission denied @ dir_s_mkdir - /usr/local/rvm/gems/ruby-2.1.0/extensions/x86-linux/2.1.0 (Errno::EACCES)

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:250:in fu_mkdir’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:224:in block (2 levels) in mkdir_p'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:222:in reverse_each’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:222:in block in mkdir_p'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:208:in each’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/fileutils.rb:208:in mkdir_p'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:210:in write_gem_make_out’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:132:in build_error'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:171:in rescue in build_extension’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:156:in build_extension'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:198:in block in build_extensions’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:195:in each'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/ext/builder.rb:195:in build_extensions’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:1436:in block in build_extensions'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/user_interaction.rb:45:in use_ui’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:1434:in build_extensions'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/stub_specification.rb:60:in build_extensions’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/basic_specification.rb:56:in contains_requirable_file?'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:925:in block in find_inactive_by_path’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:924:in each'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:924:in find’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/specification.rb:924:in find_inactive_by_path'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems.rb:185:in try_activate’

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:132:in rescue in require'

      from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:144:in require’

      from /usr/local/rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:9:in `’

    • sbl

      A co zwraca Ci ruby -v z roota?
      Jesli zwróci Ci numer Ruby 2.1 to wykonaj polecenie gem install rails

  • Kamil

    Kiedy będzie kontynuacja tematu?

  • Łukasz Pełszyński

    Ja bym polecał wykorzystanie narzędzia ruby-install (jest na githubie) + chruby

    Potem tylko: chruby 2.2

    gem install bundler
    gem install rails

    I już gra 🙂

    Mozna też skorzystać z platformy edukacyjnej CodeQuack (http://codequack.com) która umożliwia programowanie w przeglądarce.

Send this to a friend

webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL