
Anton
01.08.2018
09:29:05

Tim
01.08.2018
09:31:32
ну то есть ты говоришь, что валидировать надо только бдшные констрейнты?

Anton
01.08.2018
09:32:22

Tim
01.08.2018
09:32:27
да

Google

Anton
01.08.2018
09:33:03
Ага. И то, это от случая зависит. Иногда нужно валидировать констрейны в другом месте

Tim
01.08.2018
09:33:34
в каких случаях?

Anton
01.08.2018
09:35:42
С ходу не назову. Это зависит от реализации бизнес логики твоей

Tim
01.08.2018
09:36:16
ладно, спасибо что объяснил про валидацию в контроллерах
про контрол флоу экспешены против рэилвэй я еще не убежден. позже почитаю че ты скинул
но я короче просто против контроля прям на месте. поинт про единую точку выхода - да, есть такое
и я не знаю пока что на это ответить

Alex
01.08.2018
09:39:29
распространенный случай использования разных схем валидации - данные полученные после заполнения формы на нашем сайте - и данные от парнерского аккаунта через OAuth - модель одна, стратегии валидации разные - вызваем нужную схему на месте

Anton
01.08.2018
09:42:24
и я не знаю пока что на это ответить
А вряд ли что-то ответишь. Я сам любил такую фигню, а потом понял, что это медленный готу подход в руби и есть вещи лучше (хоть и с большим количеством абстракций)

Ilya
01.08.2018
09:42:59

Anton
01.08.2018
09:43:24
И рефакторинга будет по минимуму

Ilya
01.08.2018
09:45:12

Google

Ilya
01.08.2018
09:45:35
там конечно с пробрасыванием аргументов болезненно, но это разовое явление

Anton
01.08.2018
09:45:55

Ilya
01.08.2018
09:46:23
with_step_args метод мне не нравится)

Anton
01.08.2018
09:47:20

Ilya
01.08.2018
09:50:30
Я даже не знал, что они такое добавили, лол
и там небольшая путаница получается на выходе. у меня есть модуль где описана транзакция, касаемая валидации, есть ряд классов, которые реализуют конкретные контейнеры. то есть обернул часть транзакции в условный ValidateContainer, создал obj_validator где шаги контейнера реализованы, а в контроллере вызываю obj_validator и прокидываю в него параметры для шагов из того модуля
либо я это сделал криво
и можно было как-то погуманнее написать

Anton
01.08.2018
09:53:32
по хорошему у тебя должен быть 1 контейнер на приложение
который ты юзаешь

Ilya
01.08.2018
09:54:37

Anton
01.08.2018
09:54:44
ну типо у тебя транзакция должна быть в контейнере, а не контейнер в транзакции
вот тут примеров посмотреть можешь
http://github.com/davydovanton/cookie_box

Ilya
01.08.2018
09:55:21

Anton
01.08.2018
09:55:30
в любом оперейшене из этой папки
https://github.com/davydovanton/cookie_box/tree/master/lib

Ilya
01.08.2018
09:56:51
а где у тебя контейнер?

Anton
01.08.2018
10:01:06
https://github.com/davydovanton/cookie_box/blob/master/system/container.rb

Ilya
01.08.2018
10:02:02
спасибо

Tim
01.08.2018
10:02:48

Google

Tim
01.08.2018
10:08:24

Anton
01.08.2018
10:09:19
неа, это обычный кондишен
который явно прогоняется в определенном месте

Tim
01.08.2018
10:11:03
но дальше он ветвится и выход из функции происходит в разных местах?

Anton
01.08.2018
10:11:26
не, в одном месте, которое явно укажешь
собственно кондишены - это очевидный выход из функции, ловля ошибок - не очевидный

Максим
01.08.2018
10:15:25
Блин ребят чет не могу уловить нить разговора если не сложно можете сделать бриф небольшой а то читаю и понимаю что что то очень интересное

Tim
01.08.2018
10:16:47
а проброс ошибки норм делается?
типа в а вызывается б, в б вызывается в. в в ошибка

Anton
01.08.2018
10:17:12

Максим
01.08.2018
10:17:27
Да просто вразброс сообщения как то
Не могу понять где начало

Anton
01.08.2018
10:18:03
а что если ты еще в “б” поймаешь ее и забудешь?
а что если у тебя цепочка будет из 5 вызовов?

Tim
01.08.2018
10:18:35
вообще я бы в б сделал бы другой эксепшен и в него бы засунул тот что из б

Anton
01.08.2018
10:18:44
(я видел 6 вызовов, при этом они зацикливались, т.е. уходило в рекурсивно)

Tim
01.08.2018
10:18:50
из в то есть

Anton
01.08.2018
10:18:57
провафлишь - приложение упадет и это болезнено для юзера

Google

Tim
01.08.2018
10:19:50
ну вот, а не через ты так же будешь следить за статусами которые тебе снизу присылаются, не?

Максим
01.08.2018
10:19:59

Tim
01.08.2018
10:20:05
*не через эксепшены

Anton
01.08.2018
10:20:22
я это написал к тому, что до всего надо доходить
вот пару лет назад я бы нихуя не понял из этого разговора

Максим
01.08.2018
10:20:51
Хорошо, наверное опять мои комплексы лезут, сорян

Anton
01.08.2018
10:21:01
а потом смесь опыта + чужих идей повлияли на меня и все ок

Admin
ERROR: S client not available

Anton
01.08.2018
10:21:37
смотри пример
покажу с рабочего проекта
мне пофиг на то, что происходит в оперейшене, главное, что бы вернулся объект с нужным интерфейсом который я обработаю
при этом мне не важно что в объекте, потому что это уже забота презентера обработать ошибки правильно

Максим
01.08.2018
10:25:03
А
Ну вроде понял

Google

Максим
01.08.2018
10:25:42
Типа если есть например разные провайдеры то надо делать гейтевей через которые вызываешь нужный в зависимости от контекста и в нем уже ловишь ошибки
Так?

Anton
01.08.2018
10:26:25
не понял

Максим
01.08.2018
10:26:26
В гейтевей собсно ловишь
Ну типа вот есть разные классы например авторизации на разных ресурсах или вызова какого либо апи
И ты вместо того чтоб напрямую их звать откуда делаешь класс куда передаешь контекст и этот класс уже сам зовёт что надо и он же ловит ошибки которые ему могут передать классы провайдеры

Anton
01.08.2018
10:28:27
все равно сложно описал

Максим
01.08.2018
10:28:27
Ну как в том примере из рефакторинг форм гуд ту Грейт от чувака с thotbot

Anton
01.08.2018
10:28:41
можно пример реальный? Оо

Максим
01.08.2018
10:28:46
Блин наверное без примеров не смогу
Да ща не смогу дать я не дома

Anton
01.08.2018
10:29:00
да просто напиши пустые классы

Максим
01.08.2018
10:29:08
Но я ещё почитаю посмотрю

Anton
01.08.2018
10:29:30
будет круто!

Максим
01.08.2018
10:31:49
class Gateway
def auth(context)
Тут зовём класс например с логикой авторизации на каком либо ресурсе в зависимости от контекста и тут же ловим false который считаем ошибкой и соответственно получается что отовсюду можем явно звать этот класс и тестировать именно его вызов
end
end
Бля все равно текстом вышло

Anton
01.08.2018
10:32:20
да не, это уже понятнее

Максим
01.08.2018
10:32:51
Ну так вот вы примерно об этом же?

Артем
01.08.2018
10:33:05
а можно в двух словах почему выбрали surrealist over, к примеру fast_jsonapi?

Anton
01.08.2018
10:34:29
вот про такое
https://github.com/davydovanton/cookie_box/blob/master/lib/decks/operations/create.rb#L16-L19
можно ошибки кидать и ловить их где-то
а можно писать if else, что бы проверять что там и как