
No
29.06.2017
13:16:18
как раз по блоксхеме

Igor
29.06.2017
13:16:21
одно и тоже в if и elsif

Ростислав
29.06.2017
13:16:27
блин
точно)

Google

No
29.06.2017
13:16:55
это раз. второе - можно вынести условие в отдельный метод, если возможно как-то адекватно его назвать
и сократить до:
data = method? ? calculate_delivery(address.distance, setting) : 0
но тернарки - это вкусовщина, ИМХО ) мне такие простенькие тернарки нравятся

ojab
29.06.2017
13:18:43
лучше не использовать
def data
@data = ...
end

No
29.06.2017
13:18:57
но видел людей, у которых жёстко пылает от тернарных операторов

ojab
29.06.2017
13:19:21
@data ||= и обращаться к ней как data везде

No
29.06.2017
13:19:53
@data ||= ок, пока нам не понадобится присвоить nil

Ростислав
29.06.2017
13:20:18
понял, большое спасибо за отзыв)

ojab
29.06.2017
13:20:41
сомнительно что calculate_delivery возвращает nil

No
29.06.2017
13:21:08
это да, я согласен что так лучше ) просто многие натыкаются на этот подводный камень и подолгу ищут проблему )
решил заранее обозначить )

Alexey
29.06.2017
13:21:22
я бы написал как-нибудь так:
def delivery_cost
sum = checked_params[:sum]
return 0 if free_delivery?(sum, setting, address)
calculate_delivery(address.distance, setting)
end
def free_delivery? sum, setting, address
sum < setting.st_order_min_sum && address.distance < 40_000
end

ojab
29.06.2017
13:21:55

Google

Alexey
29.06.2017
13:24:43
ну, на вкус и цвет все карандаши разные )
мне так намного понятнее, что происходит: в первом методе мы сразу видим, что цена 0, если соблюдено условие бесплатной доставки, а если нет, то используется какая-то формула расчета.
а во 2-м методе вычисляется условие, по которому доставка будет бесплатной. если добавятся новые условия для беспл. доставки, то их будет так удобнее добавлять в отдельный метод.
по крайней мере, такой способ организации кода более идиоматичен для руби.

ojab
29.06.2017
13:27:02
что мешает эти условия в calculate_delivery перенести?

Ростислав
29.06.2017
13:27:28
Ojab, все верно, я уже переписываю нормально, занесу условия в метод

Виктор
29.06.2017
13:37:54

Fedor
29.06.2017
13:38:28
давай

Виктор
29.06.2017
13:39:15
Хорошо нужно проектировать/тестировать там, где цена ошибки(читай убытки) будет выше стоимости правильного проектирования.
Например проектирование стоит Х денег. Если бизнес теряет при возникновании ошибки 10Х он сразу соглашается
Еще, конечно, спрашивает вероятность наступления ошибки
Так что суровая правда, что править ошибку, которая не несет убытки, но мозолит взгляд разрабу бизнес считает экономически не выгодным

Fedor
29.06.2017
13:41:38

Виктор
29.06.2017
13:42:25
Не соглашусь. Каждый риск можно оцифровать. Именно на этом строиться банковский бизнес
Собственно задача бизнеса в том и заключается что бы балансировать риски. Число рисков в стартующем проекте всегда больше, чем сил проекта по закрытию этих рисков. И тут речь не только о кривом проектировании ПО, но и о принимаемых бизнес-решениях, глубине проработки договоров итд.
Тут очень просто встать в позу и сказать "нормально делай и нормально будет", но бизнес должен влезть с ограниченными ресурсами в ограниченное временное окно возможностей. Можно начать все делать как следует и не успеть - придут конкуренты, закончаться инвестиции.
Правда в том, что бы находить баланс

Ростислав
29.06.2017
13:57:28
Кстати, товарищи, я просил ревью небольшого куска, хотел спросить, я разрабатываю API, у меня все контроллеры имеют приблизительно одинаковый вид, можете сказать, на сколько хороший/плохой код и возможно какие-то рекомендации?

Fedor
29.06.2017
13:59:35
если api простое легче приделать grape, он все валидации из коробки умеет, плюс автогенерация документации через swagger
если что-то сложное, то лучше попробовать какой-нибудь валидатор типа dry-validation приделать
валидировать параметры вручную - очень геморно, придется много велосипедов изобретать

Google

Ростислав
29.06.2017
14:04:47
понял, спасибо, на счет grape понял, интересный гем, а почему на сложных API его не использовать?

Fedor
29.06.2017
14:06:00
там когда от REST уходишь всякие косяки вылезают
он не слишком гибкий
я вот уже думаю куда с него уходить, потому что не могу в него пропихнуть рекурсивную структуру
а мне хочется пачкой деревья категорй создавать

ojab
29.06.2017
14:07:55
Чем strong parameters не устроили?

Fedor
29.06.2017
14:09:02
strong params не умеет гибкую валидацию

ojab
29.06.2017
14:09:58
где там какая-то гибкая валидация?

Fedor
29.06.2017
14:10:11
вроде того, что должен быть передан только один из трех параметров, причем внутри должен лежать массив из структур определенного класса, и если они переданы то они не пустые, а если не переданы то и черт с ним

ojab
29.06.2017
14:10:16
я хз что делает check_params, например

Fedor
29.06.2017
14:10:35
в примере ее нет, но если пишется api, то скорее всего рано или поздно она понадобится

ojab
29.06.2017
14:10:37
...и откдуда уверенность что check_params что-то из этого делает?

Fedor
29.06.2017
14:10:41
а человек совета просил
и я посоветовал grape )
вместо check_params

Igor
29.06.2017
14:11:30
Валидацию куда нибудь в before_action бы убрать. Бизнес логику завернуть в сервис

ojab
29.06.2017
14:13:39
Вызов одного метода в сервис завернуть?
вызов сервиса в сервис не надо заворачивать, надеюсь?

Alexander
29.06.2017
14:14:39

Igor
29.06.2017
14:14:55
Почему одного метода? Там три строки как минимум

Google

Михаил
29.06.2017
14:15:56
В любом случае помещать рассчет бизнес-логики в контроллер - не лучшая идея.

Dmitriy
29.06.2017
14:18:00
в контроллерах не должно быть никакой логики. только вызовы команд (сервисов) и что рендерить
или hash

Igor
29.06.2017
14:23:06
Фраза "не должны быть" на самом деле плохо воспринимается. И всегда есть исключения.
Я обычно привожу такой пример. Иногда нужно делать одинаковые вещи, и при сетевом запросе, и по крону. Т.е. есть событие и действие. Контроллер - это триггер на http события. Действие должно быть вынесно в сервис, что бы иметь возможность его совершать в том числе и по событию из крона или любого другого источника

Fedor
29.06.2017
14:23:13
a grape entity не хочет нормально работать с рекурсивной структурой
а руками - влом

Igor
29.06.2017
14:24:26
А grape - ещё год назад был той ещё пакостью. То утечки, то сломают чего с обновлением

Admin
ERROR: S client not available

Fedor
29.06.2017
14:25:39
а не надо его обновлять )
работает - не трогай

Dmitriy
29.06.2017
14:26:20
валидировать надо
если передаваемая структура в параметрах имеет жестко заданную структуру, то grape позволяет валидировать. Но вот если структура динамеческая (разные уровни вложенности и наборы полей), то да, грейп плох

Igor
29.06.2017
14:26:32
Так вот одно время память утекала, обновили, сломалось в другом месте )

Nikita
29.06.2017
14:26:35
там особенно генератор документации для свагера крутой — просто песня

Igor
29.06.2017
14:27:03
Сейчас может grape стабилизировали, но трогать его уже боюсь

Nikita
29.06.2017
14:27:04
я хоте одну фичу туда вкрутить, так я просто сделал форк и все переписал
по-другому там просто никак
аж трисет как вспомню

Dmitriy
29.06.2017
14:27:40
уже второй проект на грейпе делаю. До этого был trailblazer - монстроуозная вещь

Google

Alexander
29.06.2017
14:27:57

Anton
29.06.2017
14:28:05
так трейлблейзер это не о том

Alexander
29.06.2017
14:28:19

Nikita
29.06.2017
14:28:48
без PR?
там без шансов было, я поставил временное решение, потом сгенерировал статику и выпилил все к черту
и это про PR не нужно мне тут намеков

Alexander
29.06.2017
14:29:22

Nikita
29.06.2017
14:29:42
что типа нужно было контрибьютить

Dmitriy
29.06.2017
14:29:52

Anton
29.06.2017
14:30:00

Alexander
29.06.2017
14:30:04

Nikita
29.06.2017
14:30:22

Igor
29.06.2017
14:37:04
У ActiveRecord есть сериализованные поля, если использовать JSON, то по умолчанию ключи не будет превращаться в символы.
Такое решение велосипед или имеет права на существование? https://gist.github.com/ZurgInq/f135c31625a9d409d4e0c9f58f61a041
Возможно есть штатный способ без костылей?

Dmitry
29.06.2017
14:50:01
Всем привет! В связке React + Rails API не совсем понимаю, как обрабатывать результат коллбека аутентификации через oauth2: клиент обращается к рельсам, которые его перенаправляют при помощи джема omniauth-oauth2 на сторонний ресурс, после аутентификации внешний ресурс перенаправляет клиента на страницу коллбэка. После этого шага, как мне правильно поступать: осуществить редирект с рельс обратно на клиента и в урл указать, например, токен?

ojab
29.06.2017
14:50:30
https://developers.google.com/identity/sign-in/web/reference
получай id_token и обрабатывай его через api к своему бекенду
omniauth-oauth2 тут нафиг не нужен
https://developers.google.com/identity/sign-in/web/backend-auth
^правильная ссылка

Dmitry
29.06.2017
14:52:08
Спасибо, сейчас изучу.

ojab
29.06.2017
14:54:39

Anatoly
29.06.2017
15:12:29
Подскажите, как сделать includes со скоупом / условием для заинклуженных ассоциаций?