Како да се изгради апликација 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 ќе ги задоволи потребите на апликацијата.
Прво, внатре во вашиот терминал, ажурирајте го индексот на вашиот пакет:
- sudo apt update
Следно, инсталирајте ги пакетите sqlite3
и libsqlite3-dev
:
- sudo apt install sqlite3 libsqlite3-dev
Ова ќе ги инсталира и SQLite и неговите потребни развојни датотеки.
Можете да ја проверите верзијата за да потврдите дека инсталацијата е успешна:
- sqlite3 --version
Output3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1
Со инсталиран SQLite, подготвени сте да започнете со развивање на вашата апликација.
Чекор 2 - Креирање на нов проект за шини
Со инсталирана база на податоци, можете да креирате нов проект Rails и да пристапите до некои од стандардните кодови за котел што ги нуди Rails со командата rails new
.
Создадете проект наречен sharkapp
со следнава команда:
- 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
:- cd sharkapp
Внатре во директориумот sharkapp, стартувајте го серверот Rails за да се уверите дека вашата апликација работи со користење на командата
rails server
. Ако работите на вашата локална машина, внесете го следниов код за да го стартувате серверот:- rails server
Rails стандардно се врзува за
localhost
, што значи дека можете да пристапите до вашата апликација со навигација доlocahost:3000
во вашиот прелистувач:Ако работите на сервер за развој, прво проверете дали се дозволени врски на портата
3000
:- sudo ufw allow 3000
Потоа стартувајте го серверот со знамето
--binding
, за да се поврзе со IP адресата на вашиот сервер:- 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
:- rails generate scaffold Shark name:string facts:text
Опциите
name:string
иfacts:text
во оваа команда ги означуваат полињата што ги создавате во табелата на вашата база на податоци и типот на податоци што треба да ги прифатат. И двете ви даваат простор да внесете што би сакале. Опцијататекст
дозволува повеќе знаци.По внесувањето на оваа команда, излезот ги открива сите различни датотеки што се генерираат:
Outputinvoke 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 направи голем дел од работата за изработка на кодот на апликацијата, вреди да се нурне во некои датотеки за подобро да се разбере што се случува.
За да ја разберете датотеката на контролорот, внесете ја следнава команда во вашиот терминал:
- cat app/controllers/sharks_controller.rb
Outputclass 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 приказ за вашата апликација.Извршете ја следнава команда за излез на датотеката:
- 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
:- 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
за да добиете поцелосно чувство за тоа како се создава нов примерок на ајкула:- 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
или вашиот омилен уредувач:- 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. Понатаму, тие сега имаат можност да создадат нов запис од ајкула, да ги прегледаат постоечките записи и да ги уредуваат или бришат дадените записи.
Следно, извршете миграции со следнава команда:
- rails db:migrate
Овој излез ја потврдува миграцијата:
Output== 20230124215633 CreateSharks: migrating ===================================== -- create_table(:sharks) -> 0.0041s == 20230124215633 CreateSharks: migrated (0.0045s) ============================Повторно стартувајте го серверот Rails. Ако работите локално, стартувајте:
- rails s
На сервер за развој, стартувајте:
- 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
:- 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
:- 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 за да дознаете повеќе за работата со оваа база на податоци.