База данных, Active Record, CSRF-токены и шаблонизатор / Пишем соцсеть на Ruby On Rails 6 #2
Вставка
- Опубліковано 21 тра 2024
- Привет! Во второй части мы будем работать с динамическими данными из PostgreSQL и c Active Record: выводить список постов, в том числе по топикам, создавать и редактировать посты. Также мы разберем как реализована защита от CSRF атак в Ruby On Rails.
Код тут: github.com/overeng/rubysocial
00:00 Коротко о чем видео
00:55 Устанавливаем PostgreSQL, создаем юзера для БД
02:33 Конфигурим Rails для работы с PostgreSQL
05:04 Создание моделей
07:40 Запускаем миграции
10:09 Создаем шаблон формы, расставляем теги шаблонизатора, вытаскиваем топики из базы данных
14:12 Сохраняем пост в базе данных
15:52 Защита от CSRF
18:12 Просмотр поста: шаблон + handler
19:29 Список постов на главной
21:11 Редактирование поста
25:07 Отображаем посты с разбивкой по топикам
4:58
Для пользователей unix систем рекомендую создавать роль в pg не application, как Ксения, а одноименно своей учетной записью на пк.
Связанно это с тем, что по умолчанию psql соединение осуществляется через сокеты UNIX с использованием peer аутентификации и она требует совпадения имён роли и юзера.
Как альтернатива - вам придется внести изменения в файл pg_hba.conf, заменив peer аутентификацию на md5, чтобы сработала команда db:create и прочие обращения к базе данных.
Воспользуюсь случаем и выражу благодарность Вам, Ксения. Спасибо за потраченное время, силы и нервы :)
9:22 ну есть же seeds для этого;) Ну или хотя бы в up это делать, если так уж хочется.
Спасибо! За код!
Благодарю за урок! Как раз сейчас учусь работать с CSRF в NodeJS, т.к. я вообще не шарю в стандартах безопасности пришлось заюзать csurf и использовать его с позиции черного ящика, и это плохо. Было бы классно, если бы Вы также рассказали про обеспечение безопасности на бэке в целом, какие наиболее распространенные бэкдоры оставляют разработчики, и как бэк тестируется на безопасность и отказоустойчивость.
Алексей Варов спасибо за идею! подумаю над этим
Спасибо за видео! Что вы используете в качестве фронта чистый js или библиотеку(react, stimulus reflex)?
в этом проекте почти вся логика сосредоточена на бэкенде, поэтому ни реакта, ни даже чистого js тут почти не будет.
Есть проблема на вкладке создания поста сайдбар съезжает вниз
Хотя на других вкладках все нормально. Никак не пойму как это работает. Может сталкивался кто?
ActiveRecord::RecordNotFound in PostsController#show когда хожу по топикам
Что за IDE, подскажите?
Visual Studio Code
При создании бд появилась ошибка. Решить не получилось
warning ../package.json: No license field
FATAL: Peer authentication failed for user "application"
Couldn't create 'purrpurr_development' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: FATAL: Peer authentication failed for user "application"
/home/danil/.rbenv/versions/2.5.1/bin/bundle:23:in `load'
/home/danil/.rbenv/versions/2.5.1/bin/bundle:23:in `'
Tasks: TOP => db:create
(See full trace by running task with --trace)
а пароль положили в переменную окружения?
NoMethodError in PostsController#topic
undefined method `posts' for nil:NilClass
def topic
@topic = Topic.find_by(alias: params[:topic])
@posts = @topic.posts
render 'index'
end
Вредное видео для новичков
Роутинг:
get 'posts/edit/:id', to: 'posts#edit'
по CRUD правильнее
get 'posts/:id/edit', to: 'posts#edit'
или вообще просто
resources :posts, only [...]
Миграции:
Не проставлены null: false, foriegn key, unique
Везде используются @ - хотя это считается плохим тоном,
во вьюхи лучше явно передавать переменные через render locals: {...}
Model.new(params), model.save - лучше заменить просто на model.create!(params)
Не понимаю зачем кого-то учить если сам только месяц программируешь
1. Вкусовщина
2. Где нет unique?
foreign key. Тут можно было добавить, да. Однако, хоть для этого приложения неактуально, но любые constraints влияют на производительность insert. В приложениях с большим количеством запросов на запись в секунду foreign key вообще никто не использует. Если нужно загрузить данные в таблицу, то foreign key придется удалить. Пока использование foreign key лично мне не принесло ничего, кроме проблем. Так что нельзя сказать, что foreign key - это best practice для любых случаев.
3. Про @ - вкусовщина.
4. Вкусовщина.
Спасибо за просмотр)
@@OverEngineer
1) Это стандартный Restfull Resource Naming. Рельсы ориентированы на ресурсы - зачем городить свой нейминг урлов не ясно.
2) А комменты которые ссылаются на несуществующий пост или реплай-коммент - не грузят таблицы, согласен. Если такое большое кол-во запросов валят базу из-за constraints(ооочень надо постараться ) - то брать уже нужно NoSql
3) Если у тебя опечатка в @, то возращает nil, а не нормальный Exception (undefined local variable or method ) + огромная зона видимости(плохо тестируются, различные side-эффекты, утечки памяти и тд)
4) Зачем два раза вызывать метод за место одного
Если такой код тут подается под вкусовщиной - то ладно.
PS Зато красивая 😊
3) тогда вообще джаву лучше использовать, там опечатки вообще в прод не попадут.
4) перечитала код. Там с вполне конкретной целью два метода - new возвращает объект который будет нужен для рендеринга значений полей в случае ошибки. create как и save возвращает true/false, если заменить на create то @post будет пустым и юзеру все заново заполнять придется.
English sub please 🥺
И ещё вопрос есть создайте себе времени аккаунт гугл и пишите в эту аккаунт гугл studiouz1070656@gmail.com я вам напишу потом на Счёт Германии и как бистро уезжать туда в Америку через Германию легче
какая Германия и Америка, язык для начала выучите
@@caveofmovies8597 а я уже учусь у нас красная зона