Како да се изгради апликација Ruby on Rails на Ubuntu 22.04


Вовед

Руби. Потребен е пристап со мислење за развој на апликации, под претпоставка дека поставените конвенции најдобро им служат на програмерите каде што има заедничка цел. Затоа Rails нуди конвенции за ракување со рутирање, државни податоци, управување со средства и повеќе за да се обезбеди основната функционалност што им е потребна на повеќето веб-апликации.

Rails го следи повтореното непотребно.

Во ова упатство, ќе изградите апликација Rails која им овозможува на корисниците да објавуваат информации за ајкулите и нивното однесување. Овој проект ќе послужи како почетна точка за иден развој на апликации.

Предуслови

За да го следите ова упатство, ќе ви треба:

  • Локална машина или сервер за развој што работи на Ubuntu 22.04. Вашата машина за развој треба да има корисник кој не еroot со административни привилегии и заштитен ѕид конфигуриран со ufw. За инструкции како да го поставите ова, прочитајте го нашето упатство за почетно поставување сервер со Ubuntu 22.04.
  • Како да инсталирате Node.js на Ubuntu 22.04.
  • Руби, како да се инсталира Ruby на Rails со rbenv на Ubuntu 22.04. Ова упатство користи Ruby 3.2.0, rbenv 1.2.0-52 и Rails 7.0.4.

Со инсталирани Node.js, Ruby, rbenv и Rails, подготвени сте да инсталирате база на податоци за вашата апликација.

Чекор 1 - Инсталирање SQLite3

Пред да ја креирате апликацијата Rails shark, потребна ви е база на податоци за складирање на кориснички податоци. Rails е стандардно конфигуриран да користи SQLite и ова е често добар избор во развојот. Бидејќи податоците за апликацијата не бараат програмска проширливост на високо ниво, SQLite ќе ги задоволи потребите на апликацијата.

Прво, внатре во вашиот терминал, ажурирајте го индексот на вашиот пакет:

  1. sudo apt update

Следно, инсталирајте ги пакетите sqlite3 и libsqlite3-dev:

  1. sudo apt install sqlite3 libsqlite3-dev

Ова ќе ги инсталира и SQLite и неговите потребни развојни датотеки.

Можете да ја проверите верзијата за да потврдите дека инсталацијата е успешна:

  1. sqlite3 --version
Output
3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1

Со инсталиран SQLite, подготвени сте да започнете со развивање на вашата апликација.

Чекор 2 - Креирање на нов проект за шини

Со инсталирана база на податоци, можете да креирате нов проект Rails и да пристапите до некои од стандардните кодови за котел што ги нуди Rails со командата rails new.

Создадете проект наречен sharkapp со следнава команда:

  1. rails new sharkapp

Излезот ги покажува сите различни работи што Rails ги создава за вашиот нов проект. Следниот излез нагласува некои значајни датотеки, директориуми и команди:

Output
create . . . create Gemfile . . . create app . . . create app/controllers/application_controller.rb . . . create app/models/application_record.rb . . . create app/views/layouts/application.html.erb . . . create config create config/routes.rb create config/application.rb . . . create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb . . . create config/database.yml create db create db/seeds.rb . . . run bundle install . . . Bundle complete! 15 Gemfile dependencies, 69 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. . . .

Еве краток опис на некои од креираните датотеки и папки на Rails:

  • Gemfile: оваа датотека ги наведува зависностите на скапоцените камења за вашата апликација. скапоцен камен е софтверски пакет Руби, а Gemfile ви овозможува да управувате со софтверските потреби на вашиот проект.
  • апликација: директориумот app е местото каде што живее вашиот главен код на апликацијата. Ова ги вклучува моделите, контролорите, прегледите, средствата, помошниците и испраќачите што ја сочинуваат самата апликација. Rails ви дава котел на ниво на апликација за моделот MVC да започне во датотеки како app/models/application_record.rb, app/controllers/application_controller.rb и app/views/layouts/application.html.erb.
  • config: овој директориум ги содржи конфигурациските поставки на вашата апликација:
    • config/routes.rb: декларациите за маршрутата на вашата апликација живеат во оваа датотека.
    • config/application.rb: Општите поставки за компонентите на вашата апликација се наоѓаат во оваа датотека.

    Конечно, Rails ја извршува командата bundle install за да ги инсталира зависностите наведени во вашата Gemfile.

    Откако сè ќе се постави, одете до новиот директориум sharkapp:

    1. cd sharkapp

    Внатре во директориумот sharkapp, стартувајте го серверот Rails за да се уверите дека вашата апликација работи со користење на командата rails server. Ако работите на вашата локална машина, внесете го следниов код за да го стартувате серверот:

    1. rails server

    Rails стандардно се врзува за localhost, што значи дека можете да пристапите до вашата апликација со навигација до locahost:3000 во вашиот прелистувач:

    Ако работите на сервер за развој, прво проверете дали се дозволени врски на портата 3000:

    1. sudo ufw allow 3000

    Потоа стартувајте го серверот со знамето --binding, за да се поврзе со IP адресата на вашиот сервер:

    1. rails server --binding=your_server_ip

    Одете до http://your_server_ip:3000 во вашиот прелистувач, за да пристапите до стандардната целна страница на Rails.

    Кога ќе бидете подготвени, можете да го запрете серверот со притискање на CTRL+C во вашиот терминал.

    Со креирана и поставена апликација, спремни сте да започнете со градење од котелската плоча на Rails за да создадете единствена апликација.

    Чекор 3 - Поставување скелиња на апликацијата

    За да ја креирате апликацијата ајкула, треба да креирате модел за управување со податоците од вашата апликација, прегледи за да овозможите корисничка интеракција со тие податоци и контролор да управува со комуникацијата помеѓу моделот и погледите. За да ги изградите, користете ја командата шините генерираат скеле. Ова генерира модел, операции за креирање, читање, ажурирање и бришење (CRUD) за апликацијата и шаблони за делови, помошници и тестови.

    Командата генерира скеле врши многу работи под хаубата. Командата го вклучува името на моделот и полињата што ги сакате во табелата на вашата база на податоци. Rails користи Ruby класа, а исто така ја наследува класата ActiveRecord::Base. Ова значи дека можете да работите со вашата класа на модели на ист начин како што би работеле со класата Ruby. Понатаму, можете исто така да повлечете методи од Active Record. Active Record осигурува дека секоја класа е мапирана со табела во вашата база на податоци, и секој примерок од таа класа, во ред во таа табела.

    Извршете ја следнава команда за да генерирате модел, контролер и поврзани прикази Shark:

    1. rails generate scaffold Shark name:string facts:text

    Опциите name:string и facts:text во оваа команда ги означуваат полињата што ги создавате во табелата на вашата база на податоци и типот на податоци што треба да ги прифатат. И двете ви даваат простор да внесете што би сакале. Опцијата текст дозволува повеќе знаци.

    По внесувањето на оваа команда, излезот ги открива сите различни датотеки што се генерираат:

    Output
    invoke active_record create db/migrate/20190804181822_create_sharks.rb create app/models/shark.rb . . . invoke resource_route route resources :sharks invoke scaffold_controller create app/controllers/sharks_controller.rb invoke erb create app/views/sharks create app/views/sharks/index.html.erb create app/views/sharks/edit.html.erb create app/views/sharks/show.html.erb create app/views/sharks/new.html.erb create app/views/sharks/_form.html.erb . . .

    Rails го создадоа моделот на app/models/shark.rb и миграција на базата на податоци за да продолжи со него: db/migrate/20190804181822_create_sharks.rb . Временскиот печат на вашата датотека за миграција ќе се разликува од излезниот примерок.

    Создаде и контролер, app/controllers/sharks_controller.rb, како и прегледите поврзани со CRUD операциите на вашата апликација, собрани во app/views/sharks. Меѓу овие прикази е делумна, _form.html.erb, која содржи код што се користи низ прегледите.

    Конечно, Rails додаде нова снаодлива рута, resources :sharks, во config/routes.rb. Ова му овозможува на рутерот Rails да одговара на дојдовните барања за HTTP со контролерот sharks и неговите поврзани прикази.

    Иако Rails направи голем дел од работата за изработка на кодот на апликацијата, вреди да се нурне во некои датотеки за подобро да се разбере што се случува.

    За да ја разберете датотеката на контролорот, внесете ја следнава команда во вашиот терминал:

    1. cat app/controllers/sharks_controller.rb
    Output
    class SharksController < ApplicationController before_action :set_shark, only: %i[ show edit update destroy ] # GET /sharks or /sharks.json def index @sharks = Shark.all end # GET /sharks/1 or /sharks/1.json def show end # GET /sharks/new def new @shark = Shark.new end # GET /sharks/1/edit def edit end # POST /sharks or /sharks.json def create @shark = Shark.new(shark_params) respond_to do |format| if @shark.save format.html { redirect_to shark_url(@shark), notice: "Shark was successfully created." } format.json { render :show, status: :created, location: @shark } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # PATCH/PUT /sharks/1 or /sharks/1.json def update respond_to do |format| if @shark.update(shark_params) format.html { redirect_to shark_url(@shark), notice: "Shark was successfully updated." } format.json { render :show, status: :ok, location: @shark } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # DELETE /sharks/1 or /sharks/1.json def destroy @shark.destroy respond_to do |format| format.html { redirect_to sharks_url, notice: "Shark was successfully destroyed." } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_shark @shark = Shark.find(params[:id]) end # Only allow a list of trusted parameters through. def shark_params params.require(:shark).permit(:name, :facts) end end

    Контролорот е одговорен за управување со тоа како информациите се преземаат и пренесуваат до неговиот поврзан модел и како тие се поврзуваат со одредени прикази. На пример, контролерот sharks вклучува серија методи кои приближно се пресликуваат на стандардните операции CRUD. Постојат повеќе методи од функциите CRUD, за да се овозможи ефикасност во случај на грешки.

    На пример, разгледајте го методот креирај:

    . . .
      def create
        @shark = Shark.new(shark_params)
    
        respond_to do |format|
          if @shark.save
            format.html { redirect_to @shark, notice: 'Shark was successfully created.' }
            format.json { render :show, status: :created, location: @shark }
          else
            format.html { render :new }
            format.json { render json: @shark.errors, status: :unprocessable_entity }
          end
        end
      end
    . . . 
    

    Ако нов примерок од класата Shark е успешно зачуван, redirect_to ќе создаде ново барање кое потоа се упатува до контролорот. Ова е барање GET и ќе се постапува со методот покажи, кој на корисникот ќе му го открие влезот што неодамна го додал.

    Ако има дефект, тогаш Rails повторно ќе го прикаже шаблонот app/views/sharks/new.html.erb наместо да бара друго барање до рутерот, давајќи им на корисниците уште една шанса да ги достават своите податоци.

    Покрај контролерот ајкули, Rails создаде шаблон за приказ index, кој се пресликува на методот index во вашиот контролер. Ќе го користите ова како root приказ за вашата апликација.

    Извршете ја следнава команда за излез на датотеката:

    1. cat app/views/sharks/index.html.erb
    Output
    <p style="color: green"><%= notice %></p> <h1>Sharks</h1> <div id="sharks"> <% @sharks.each do |shark| %> <%= render shark %> <p> <%= link_to "Show this shark", shark %> </p> <% end %> </div> <%= link_to "New shark", new_shark_path %>

    Приказот index се врти низ примероците од вашата класа Shark, која се пресликува на табелата ајкули во вашата база на податоци. Користејќи го образецот ERB, приказот го прикажува секое поле од табелата што е поврзано со поединечен пример на ајкула: име и факти.

    Погледот потоа ги користи помошниците што ви станаа достапни кога ја дефиниравте снаодливата рута ајкули со командата rails generate scaffold.

    Приказот нов го користи она што се нарекува парцијално. Извршете го следново за да го вратите шаблонот app/views/sharks/new.html.erb:

    1. cat app/views/sharks/new.html.erb
    Output
    <h1>New shark</h1> <%= render "form", shark: @shark %> <br> <div> <%= link_to "Back to sharks", sharks_path %> </div>

    Иако овој шаблон може да изгледа како да му недостигаат полиња за внесување за нов запис на ајкула, референцата за образец за рендерирање покажува дека шаблонот го повлекува делот _form.html.erb, кој извлекува код што се повторува низ прегледите.

    Излезете ја датотеката _form.html.erb за да добиете поцелосно чувство за тоа како се создава нов примерок на ајкула:

    1. cat app/views/sharks/_form.html.erb
    Output
    <%= form_with(model: shark) do |form| %> <% if shark.errors.any? %> <div style="color: red"> <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2> <ul> <% shark.errors.each do |error| %> <li><%= error.full_message %></li> <% end %> </ul> </div> <% end %> <div> <%= form.label :name, style: "display: block" %> <%= form.text_field :name %> </div> <div> <%= form.label :facts, style: "display: block" %> <%= form.text_area :facts %> </div> <div> <%= form.submit %> </div> <% end %>

    Овој шаблон ја користи формата помошник. Помошниците за форми се дизајнирани да го олеснат создавањето на нови објекти од внесување на корисникот користејќи ги полињата и опсегот на одредени модели. Во овој пример, form_with го зема model: shark како аргумент и новиот објект за создавање форма што го создава има влезови од поле што одговараат на полињата во ајкулите табела. Ова значи дека корисниците имаат полиња за формулари за внесување и име и ајкула факти.

    Поднесувањето на овој формулар ќе создаде JSON одговор со кориснички податоци до кои остатокот од вашата апликација може да пристапи преку методот на парамови. Ова создава објект ActionController::Parameters со тие податоци.

    Сега кога знаете што ви создала шините генерираат скеле, можете да продолжите со поставување на root приказот за вашата апликација.

    Чекор 4 - Креирање на Root View и функционалност за тестирање на апликацијата

    Идеално, сакате целната страница на вашата апликација да се мапира на коренот на апликацијата, за корисниците веднаш да добијат чувство за целта на апликацијата.

    На пример, можете да креирате контролер Добре дојдовте и поврзан приказ index, што им дава на корисниците генеричка целна страница која исто така може да се поврзе до различни делови од апликацијата.

    За да го поставите ова, треба да ги измените поставките за насочување во config/routes.rb за да го наведете коренот на апликацијата.

    Отворете го config/routes.rb за уредување, користејќи nano или вашиот омилен уредувач:

    1. nano config/routes.rb
    Rails.application.routes.draw do
      resources :sharks
      # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
    
      # Defines the root path route ("/")
      # root "articles#index"
    end
    

    Без поставување нешто поконкретно, стандардниот приказ на http://localhost:3000 или http://your_server_ip:3000 ќе биде стандарден Страна за добредојде на Rails.

    За да го мапирате коренскиот приказ на апликацијата со приказот index на контролерот на ајкулите, отстранете ја стандардната линија #root articles#index со отстранување на # и замена на article со ајкула:

    Rails.application.routes.draw do
      resources :sharks
    
      root 'sharks#index' 
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    end
    

    Зачувајте ја датотеката и излезете од уредникот кога ќе завршите со уредувањето. Ако користевте nano за да излезете од датотеката, притиснете CTRL+X, Y, потоа ENTER

    Сега, кога корисниците се движат до коренот на вашата апликација, тие влегуваат во целната страница на ајкула за разлика од стандардната целна страница на Rails. Понатаму, тие сега имаат можност да создадат нов запис од ајкула, да ги прегледаат постоечките записи и да ги уредуваат или бришат дадените записи.

    Следно, извршете миграции со следнава команда:

    1. rails db:migrate

    Овој излез ја потврдува миграцијата:

    Output
    == 20230124215633 CreateSharks: migrating ===================================== -- create_table(:sharks) -> 0.0041s == 20230124215633 CreateSharks: migrated (0.0045s) ============================

    Повторно стартувајте го серверот Rails. Ако работите локално, стартувајте:

    1. rails s

    На сервер за развој, стартувајте:

    1. rails s --binding=your_server_ip

    Одете до localhost:3000 ако работите локално, или http://your_server_ip:3000 ако работите на сервер за развој, за да пристапете до вашата нова целна страница:

    За да креирате нова ајкула, кликнете на врската Нова ајкула. Оваа врска ве води до рутата ајкули/new:

    Можете да додадете некои информации за да ја тестирате вашата апликација. Напишете \Големо бело во полето Име и \Страшно во полето Факти:

    Потоа, притиснете го копчето Креирај ајкула за да ја создадете ајкулата.

    Ова копче ве упатува на маршрутата show, која, благодарение на филтерот before_action, е поставена со методот set_hark, кој го зафаќа id на ајкулата што ја создадовте:

    class SharksController < ApplicationController
      before_action :set_shark, only: %i[ show edit update destroy ]
    
      . . . 
      # GET /sharks/1 or /sharks/1.json
      def show
      end
    
      . . . 
    
      private
        # Use callbacks to share common setup or constraints between actions.
        def set_shark
          @shark = Shark.find(params[:id])
        end
      . . .
    

    Можете да ја тестирате функцијата за уредување со притискање на Уреди ја оваа ајкула на записот за ајкула. Ова ќе ве однесе до маршрутата уреди за таа ајкула:

    Ажурирајте ги фактите за Големото бело за да читате „Голема“ наместо „Страшно“, а потоа притиснете Ажурирај ајкула. Ова ќе ве врати на маршрутата покажи:

    Конечно, со притискање на Назад во ајкули ќе се доведете до ажурираниот приказ на index:

    Сега кога сте ја тестирале основната функционалност на вашата апликација, можете да додадете неколку валидации и безбедносни проверки за да направите сè побезбедно.

    Чекор 5 - Додавање валидации

    Вашата апликација за ајкула може да прифати влез од корисниците, но замислете случај кога корисникот се обидува да создаде ајкула без да додаде факти на неа, или создава запис за ајкула што веќе е во базата на податоци. Можете да креирате механизми за проверка на податоците пред да бидат внесени во базата на податоци со додавање валидации на вашите модели. Бидејќи логиката на вашата апликација се наоѓа во нејзините модели, валидирањето на внесените податоци таму е соодветно.

    Забележете дека ова упатство не опфаќа тестови за валидација за пишување, но можете да дознаете повеќе за тестирањето со консултирање на документацијата на Rails.

    Ако сè уште не сте го сопреле серверот, запрете го серверот сега со притискање на CTRL+C во вашиот терминал.

    Отворете ја вашата датотека со модел shark.rb:

    1. nano app/models/shark.rb

    Во моментов, датотеката ни кажува дека класата Shark наследува од ApplicationRecord, која пак наследува од ActiveRecord::Base:

    class Shark < ApplicationRecord
    end
    

    Додајте неколку валидации во полето име за да потврдите дека полето е пополнето и дека записот е единствен, спречувајќи дупликати записи:

    class Shark < ApplicationRecord
      validates :name, presence: true, uniqueness: true
    end
    

    Следно, додадете валидација за полето факти за да се осигурате дека и тоа е пополнето:

    class Shark < ApplicationRecord
      validates :name, presence: true, uniqueness: true
      validates :facts, presence: true
    end
    

    Линијата на кодот потврдува: факти, присуство: точно не се занимава со единственоста на фактите. Ја потврдува нејзината поврзаност со уникатни записи од ајкули.

    Зачувајте ја и затворете ја датотеката кога ќе завршите.

    Стартувајте го вашиот сервер уште еднаш со rails s или rails s --binding=your_server_ip, а потоа одете до коренот на вашата апликација на http://localhost:3000 или http://your_server_ip:3000.

    Притиснете на врската Нова ајкула. Во формата, додајте \Great White во полето Име и \Big Teeth во полето Факти, а потоа притиснете Create Shark . Во овој случај се појавува предупредувачка порака:

    За да ја проверите другата валидација, кликнете Назад кон ајкулите за да се вратите на почетната страница, а потоа притиснете Нова ајкула уште еднаш. Во новата форма, внесете \Tiger Shark во полето Име и оставете ги празните Факти. Кога ќе притиснете Креирај ајкула, таа излегува следново предупредување:

    Со овие промени, вашата апликација има одредени валидации за да се обезбеди конзистентност на податоците што се зачувани во базата на податоци. Сега можете да го свртите вниманието кон корисниците на вашата апликација и да дефинирате кој може да ги менува податоците на апликацијата.

    Чекор 6 - Додавање автентикација

    Со одредени валидации, имате одредени гаранции за податоците што се зачувуваат во базата на податоци. Но, што е со корисниците? Ако не сакате сите корисници да додаваат во базата на податоци, тогаш треба да додадете некои мерки за автентикација за да се осигурате дека само дозволените корисници можат да додаваат ајкули. За да го направите ова, користете го методот http_basic_authenticate_with, кој овозможува создавање комбинација на корисничко име и лозинка за автентикација на корисниците.

    Постојат голем број начини за автентикација на корисниците со Rails, вклучително и работа со deise скапоцените камења. Засега, сепак, додајте метод во контролорот на вашата апликација што ќе се применува на дејствата низ вашата апликација. Ова ќе биде корисно ако додадете повеќе контролери во апликацијата во иднина.

    Запрете го вашиот сервер со CTRL+C.

    Отворете ја датотеката што го дефинира вашиот ApplicationController:

    1. nano app/controllers/application_controller.rb

    Внатре е дефиницијата за класата ApplicationController, која другите контролери во вашата апликација ја наследуваат од:

    class ApplicationController < ActionController::Base
    end
    

    За автентикација на корисниците, користете тврдокодирано корисничко име и лозинка со методот http_basic_authenticate_with. Додадете го следниов код во датотеката:

    class ApplicationController < ActionController::Base
      http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show]
    end
    

    Покрај наведувањето на корисничкото име и лозинката овде, ја ограничивте и автентикацијата со одредување на маршрутите каде што не треба да се бара: index и покажи >. Друг начин да се постигне ова би било да се напише само: [:create, :update, :destroy]. На овој начин, сите корисници ќе можат да пристапат до сите ајкули и да читаат факти за одредени ајкули. Меѓутоа, кога станува збор за менување на содржината на страницата, корисниците ќе треба да докажат дека имаат пристап.

    Во посилно поставување, не би сакале да ги шифрирате вредностите на овој начин, но овој пример покажува како можете да вклучите автентикација за маршрутите на вашата апликација. Rails стандардно ги складира податоците за сесиите во колачињата: штом ќе се автентицирате на одредено дејство, нема да се бара повторно да се автентицирате во истата сесија.

    Зачувајте и затворете го app/controllers/application_controller.rb кога ќе завршите со уредувањето. Сега можете да ја тестирате автентикацијата на дело.

    Стартувајте го серверот со rails s или rails s --binding=your_server_ip и одете до вашата апликација на било која http:// localhost:3000 или http://your_server_ip:3000.

    На целната страница, притиснете го копчето Нова ајкула. Ова ќе го активира следниов прозорец за автентикација:

    Ако ги внесете корисничкото име sammy и лозинката shark, што е комбинацијата што ја додадовте во app/controllers/application_controller.rb, ќе бидете може безбедно да создаде нова ајкула.

    Сега имате работна апликација за ајкула, комплетна со валидации на податоци и основна шема за автентикација.

    Заклучок

    Апликацијата Rails што ја создадовте во ова упатство е точка за скокање што можете да ја користите за понатамошен развој. Ако сте заинтересирани да го истражувате екосистемот Rails, проектната документација е одлично место за почеток.

    Можете исто така да дознаете повеќе за додавање вгнездени ресурси на вашиот проект со читање Како да креирате вгнездени ресурси за апликацијата Ruby on Rails, која ќе ви покаже како да ги изградите моделите и маршрутите на вашата апликација.

    Дополнително, можеби ќе сакате да истражите како да поставите поцврст преден дел за вашиот проект со рамка како што е Како да поставите проект Ruby on Rails со React Frontend нуди насоки како да го направите ова.

    Ако сакате да истражите различни опции за базата на податоци, можете исто така да ги проверите упатствата за PostgreSQL за да дознаете повеќе за работата со оваа база на податоци.