
Nikolay
03.09.2016
10:33:19
не, чувак

Alex
03.09.2016
10:33:19
я тоже подумал что это будет удобно, поэтому начал пилить. Мне уже дважды приходилось прикручивать смски, и я понял что там этого не хватает.

Nikolay
03.09.2016
10:33:44
на самом деле у каждой железки свои приколы

Alex
03.09.2016
10:33:57

Google

Alex
03.09.2016
10:34:57
Я сейчас застрял над тем как сделать нормальное апи под гем, но в процессе дискуссии вы напомнили про то что я вообще объект могу вернуть, крутяк.

Nikolay
03.09.2016
10:36:47
Ну, например?
я видел три железки. жсм гейт шо у меня на столе мелкий, размером с диалапный модем. вторая железка - это юнитовый тазик в стойке, от которого выходил тоже рж45 + толстое кабло для кучи жсм антенн
так вот последний мог штырить кажется чуть ли не в полсотни потоков )))

Alex
03.09.2016
10:37:27

Nikolay
03.09.2016
10:37:30
и имел настройки на доступ к смс центрам операторов

Alex
03.09.2016
10:38:03
Смотри, мой юзкейс
есть сайт. Я хочу отправлять смс.
Что я сейчас делаю? пилю класс под конкретный смс сервис.
И мне надо разруливать чтобы в тестовых окружениях результат мокался.
А на стейжинге/проде реально отправлялся.
В девелопменте я хочу видеть какой код был. В тесте мне похуй.

Nikolay
03.09.2016
10:38:49
разница большая. окей, на примере своего ерр гема могу только сказать, что мне пришлось отказаться от программной генерации хмл файлов с запросами по одной причине - все ерр партнеры даже в рамках рфц для работы с доменами косячили такую хуйню, что мне проше взять шаблон и обработать его ерб
это кстати подтвердили на хабре разработчики мегабилинга, что у них тоже адский набор костылей получился

Google

Alex
03.09.2016
10:39:48
Большинство смс апи это хттп с некоторой апишкой.
статус коды и так далее.

Nikolay
03.09.2016
10:40:15
угу

Alex
03.09.2016
10:40:36
Вот под них я и пишу объединенное апи, чтобы смс-бэкенд можно было как перчатки менять не переписывая ровным счетом ничего.
и также легко подключить в свой проект

Nikolay
03.09.2016
10:40:49
поэтому я бы сделал свой гем в котором в конфигах прописывал а) куда, б) как отправлять и как искать ответ
три вещи которые нужны

Alex
03.09.2016
10:41:12
подключил гем апи, подключил гем бэкенда, зарегал бэкенд в геме, юзаешь гемовое апи.

Nikolay
03.09.2016
10:41:30
подключил гем, прописал в конфигах три пункта, профит )
ты имхо усложняешь

Alex
03.09.2016
10:42:54
SMS.configure do |c|
c.register_backend :smsru, SMS::Backend::Smsru, token: ENV['SMS_RU_TOKEN']
end
resp = SMS.send_sms(phone, text)
if resp.success?
# good
else
# backend returned bad
end
Что тут сложного?
и чонить типа
gem 'sms'
gem 'sms-backend-smsru'
в гемфайле.
Я тут честна не вижу ничего сложного )

ojab
03.09.2016
12:42:38
зачем имя бекенда обязательно указывать? Его можно по умлочанию из имени класса делать
алсо почему это Symbol, а не строка?

Nikolay
03.09.2016
13:46:14
туточки?
ой

Google

Nikolay
03.09.2016
13:48:12
у меня почему то при model.save пропадает в базе связь с моделью belongs_to (
хотя has_many и belongs_to прописаны
при этом связь с другой моделью держится и сохраняется

ojab
03.09.2016
13:52:05
ассоциация становится nil`/`NULL в базе?

Nikolay
03.09.2016
13:52:24
угу...

ojab
03.09.2016
13:52:58
если присвоить не модель, а модель_id — тоже обнуляется?

Nikolay
03.09.2016
13:53:29
ща попробую
domain
=> #<Domain:0x0055af4d4f2458
domain_zone_id: "101d3903-5c55-4409-8428-d712b4d39ce2",
client_id: "55b8636c-7796-4823-ace8-978ba306c389",
&&
>Domain.first
=> #<Domain:0x0055af4ec32b68
domain_zone_id: nil,
client_id: "55b8636c-7796-4823-ace8-978ba306c389",
первое то что в памяти, второе уже сохраненная в постгре копия
единственное что поменялось - это я сменил калбек установки это доменной зоны с before_save на after_initialize
after_initialize :set_properties
def set_properties
domainsrc = self.name_idn.insert(0, 'http://') unless self.name_idn.match('http://')
self.name_ascii = Addressable::URI.parse(domainsrc).normalized_host.downcase.split('.')[0]
self.name_idn = domainsrc.gsub('http://', '').split('.')[0]
zone = Addressable::URI.parse(domainsrc).normalized_host.downcase.split('.')[1..-1].join('.')
self.domain_zone = DomainZone.find_by(name_ascii: zone)
end


ojab
03.09.2016
13:58:44
after_initialize будет дёргаться после каждого .find и прочих инициализаций, ты в курсе?

ojab
03.09.2016
13:59:06
так что для единичной инициализации лучше юзать after_initialize :set_properties, if: :new_record? или подобное

Nikolay
03.09.2016
13:59:12
тоесть вернуть на before_save?
а где вообще про эти калбеки развернуто почитать?

ojab
03.09.2016
13:59:50
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
я обычно юзаю before_validation, on: :create если нужно какими-то данными заполнять при создании

Nikolay
03.09.2016
14:00:39
ну вот этот калюек который after_initialize не опитсан вообще

ojab
03.09.2016
14:01:12
>Lastly an after_find and after_initialize callback is triggered for each object that is found and instantiated by a finder, with after_initialize being triggered after new objects are instantiated as well.

Nikolay
03.09.2016
14:01:16
а. описан, но не в списке..

Google

Nikolay
03.09.2016
14:04:52
тогда мысл этих двух колбеков?

ojab
03.09.2016
14:05:47
сейчас, наверное, уже нет особого смысла
раньше можно было какой-нибудь аттрибут десериализовать, навпример

Nikolay
03.09.2016
14:06:36
ххм

ojab
03.09.2016
14:06:48
чото я не очень понимаю что ты в методе выше пытаешься сделать
зачем нужен domainsrc?

Nikolay
03.09.2016
14:06:58
у меня например пару свойств хранятся как массив в строке постгревый и как hstore

ojab
03.09.2016
14:07:02
URI::parse и без схемы сработает
сейчас десериализация есть из коробки
ну и я больше про объекты, а не про массивы и прочие базовые типы

Admin
ERROR: S client not available

Nikolay
03.09.2016
14:07:55
идея в чем. адрессабл работает только с полным uri т.е http://some.shit.here
если сказать адрессаблу распарсить 'some.shit.here' оно не отловит там хост

ojab
03.09.2016
14:08:57
а
http://api.rubyonrails.org/classes/ActionDispatch/Http/URL.html
я просмотрел что он используется, думал что ActionDispatch::Http::URL

Nikolay
03.09.2016
14:09:36
мне адрессабл важен потому что идн домены
типа москва.говно
а либидн - так себе получился

ojab
03.09.2016
14:11:02
ActionDispatch::Http::URL вполне обрабатывает нелатиницу

Google

Nikolay
03.09.2016
14:11:25
ээ. мне не сайты нужны
а доменные имена

ojab
03.09.2016
14:11:55
punycode в смысле?

Nikolay
03.09.2016
14:12:13
ога
я их адресаблом конверну
*чу

ojab
03.09.2016
14:12:34
а, ок
А зачем в базе/где-то ещё кроме общения с внешним миром punycode хранить?
(общение с внешним миром — epp, а не клиентксий интерфейс)

Nikolay
03.09.2016
14:14:10
чем постоянно дергать конвертер проще сохранить в поле

ojab
03.09.2016
14:15:09
и получить потенциальную неконсистентность в базе

Nikolay
03.09.2016
14:15:29
неконсистентность чего?
у домена после создания можно только сменить нс сервера и статус. ну и контакты владельца

ojab
03.09.2016
14:15:58
несовпадение punycode_name и unicode_name
ну да как тебе удобнее, спрочем

Nikolay
03.09.2016
14:16:37
в принципе имя домена после создания не отредактировать ))
ох епт. 600 доменов в базу вливается
надо пагинатор нарисвать
как мне прописать паблик алиас к приватному методу модели?
чтобы два раза код не писать

ojab
03.09.2016
14:42:44
а зачем его делать приввтным в таком случае?

Nikolay
03.09.2016
14:44:04
это тот самый set_properties который из калбека дергается перед сохранением
хотя если я его открою наверное ничего не изменится