СЛОУНОВОСТИRuby 2.6 introduces an initial implementation of JIT (Just-in-time) compilerRuby 2.5 has removed top level constant lookupRuby 2.5 requires pp by defaultRuby 2.5 added lazy proc allocation for block parametersRuby 2.4 unifies Fixnum and Bignum into IntegerПредыдущий тред: https://2ch.hk/pr/res/1272457.htmlИЗУЧЕНИЕ ЯЗЫКАQ: C чего мне начать, чтобы стать рубистом?A: Отличным началом будет Programming Ruby (The Pragmatic Programmers Guide), читать Eloquent Ruby и The Well Grounded Rubyist после прочтения первой толку особо не даст, одни и те же вещи, дальше читаем Ruby Way, затем познаем метапрограммирование с Metaprogramming Ruby.А дальше открываем Ruby cookbook 2015 года, Пишем свой код во время чтения.Q: Следующий уровень, продвинутые книги по руби:A: Confident Ruby by Avdi Grimm | Practical Object-Oriented Design in RubyRefactoring Ruby Edition | Ruby Under a MicroscopeQ: Онлайн курсы чтобы попробовать/вкатиться:A: http://tryruby.org/levels/1/challenges/0/ | https://rubymonk.com/http://www.codewars.com/?language=ruby | http://rubykoans.comQ: Какой gem посмотреть, чтобы понять, как писать код?A: Лучше всего посмотреть небольшие gem'ы вроде cancancan, pundit, camping.Еще можешь полистать на гитхабе гемы с нарастающей популярностю (там еще нет тысяч строк, и тебе будет легче понять): https://github.com/trending?l=rubyQ: Хорошие практики по руби и рельсам?A: Обязательно стайлгайды (как оформлять код):https://github.com/bbatsov/ruby-style-guidehttps://github.com/JuanitoFatas/fast-rubyhttps://github.com/bbatsov/rails-style-guideРуководства "для чайников":https://www.railstutorial.org/book [en]http://www.theodinproject.com/ruby-on-rails [en] | http://codenamecrud.ru/ [ru]Q: Документация по стандартным библиотекам руби и рельс:A: http://ruby-doc.org/ | http://api.rubyonrails.orghttp://guides.rubyonrails.org | http://ruby.railstutorial.orgQ: Можно ли на руби писать нативные GUI, мобильные приложения, игры?A: Нет.Q: Что ещё изучить?A: Английский, git, linux. Паттерны. Один из часто используемых - Service Object.СРЕДА РАЗРАБОТКИQ: Как установить разные версии рубей?A: https://rvm.io | https://github.com/sstephenson/rbenv
ТестыВот скажите, где золотая пуля? В рельсах есть так называемые фикстуры - пишешь в ямле объекты и используешь их в своих тестах.Еще есть FactoryBot - описываешь так называемую фабрику и она при помощи лаконичного вызова генерит объекты.Практически безапеляционно побеждают фабрики ибо позволяют генерить любые наборы, под нужную ситуацию, что было бы просто нереально захардкодить фикстурами.Ок.Но есть задачи со сложной предметной областью: когда у моделей/проекта есть жизненный цикл с множеством состояний и ветвистый процесс. И чтобы протестировать программу в конкретной точке, недостаточно просто сгенерить несколько объектов. А нужен весьма большой сетап из нескольких моделей (не двух и не трех), со взаимозависимыми (!) стейтами и с кучей подчиненных объектов.Если это делать при помощи фабрик, то уже третья ассоциация становится адом. И это только иерархия, без учета количества объектов и свойств связанных объектов. Отдельная боль это валидации, ведь фабрики должны быть валидными очевидно нехуй держать валидации в моделях.Каждый раз когда я попадаю в такую ситуацию, я охуеваю.Вопрос - есть ли какая-либо практика для таких случаев, когда нужно тестировать сложные контексты в разных точках жизненного цикла?PSИ еще один смежный вопрос. Вот в Рспеке есть стабы и запись типа allow_any_instance_of to_recieve... И оговорка, что вообще-то это прием для легаси кода, и этого надо избегать.А как же избегать, если тестируемые процессы много от чего зависят. Ну например какой-нибудь сервис-обджект, который использует другой сервис-обджект, оба используют квери-обджекты и еще используют полиси-обджекты. Уже дохуя, хотя все примитивно. И мы хотим протестить наш SO. И чтобы не моделировать сложные контексты для этих вложенных сервис/квери/полиси-обджетов (ибо тестируем не их) мы берем их и стабаем с нужным результатом - чтобы получить нужную ситуацию. А если не стабать, то как тогда? Dependency Injection? Но в таком случае наш объект помимо своих основных параметров должен принимать еще штук пять DI-инъекций. Код превратится во что-то неперевариваемое.
>>1324696>Вопрос - есть ли какая-либо практика для таких случаев, когда нужно тестировать сложные контексты в разных точках жизненного цикла?В текущем проекте пишем методы которые создают объекты/добавляют стабы и вызываем их потом в before. Причем может быть много небольших методов создающих только небольшие части контекста и на их основе уже строятся более сложные методы. Все эти методы принимают один хеш с настройками, если метод составной, то он соответственно, передает этот хеш ниже. Не то что бы идеальное решение, но в проекте уже 10к+ тестов и пока полет нормальный.>А если не стабать, то как тогда? Dependency Injection?DI в руби не нужен, я считаю, это не джава, где все гвоздями прибито. По-моему это они на волне хайпа DI года 3 назад решили написать, что allow это плохо. А так сколько я не работал, везде в тестах были allow, использование DI в продакшене проектах не видел ни разу. Хотя злоупотреблять allow тоже не стоит, а то вполне могут получится тесты, которые только стабы одни и тестируют, а не реальный код.
>>1324910Я на django никогда не писал, но слышал, что батареек в нем меньше, чем в рельсах. И спрашивается зачем он тогда нужен? Если уж отказываться от батареек и писать не на руби, то лучше взять сразу какой-нибудь kotlin со спринг бутом или ktor, а не такой же тормозной питон.
>>1325163>злоупотреблять allow тоже не стоит, а то вполне могут получится тесты, которые только стабы одни и тестируютТам кстати нужно включить настройку, какую не помню, чтобы проверялась сигнатура, то есть чтобы проверялось существование застабаных методов.
>>1325171Зато вакансий причем годных дохуя. А по рельсам уже второй год висят одни и те же 15 вакансий на легаси-проекты аля "доработка функционала, фиксинг багов".
>>1325295Вакансии на питоне могут неплохие на МЛ быть, а веб-параша, она и есть веб-параша. Скинь парочку что ли, а то я проскролил первую страницу hh с поиском по django и ничего годного не нашел.
>>1325418Просто зашел на фрилансим, смотрю что есть по руби - ну буквально задачи четыре. Потом смотрю питон - а там несколько страниц. Ну я и экстраполировал это на вакансии.Да и так я частенько видел годноту на питоне. Мапс.ме относительно недавно видел, например, и вообще мейловые вакансии часто встречал.Кстати, у меня такое ощущение, что в питере больше рубишных вакансий, вам не кажется?
Посоны, а что случилось с rubyjobs.ru? Я раньше там мониторил буржуйские вакансии для вань, а теперь хуй.
>>1325427>фрилансимТак-то да, русскоязычный фриланс на руби мертв, но он всегда был мертв, хочешь фрилансить на руби, идешь на апворк.>Мапс.ме относительно недавно видел, например, и вообще мейловые вакансии часто встречал.У нас, наверное, разное понятие годноты, хотя в мапс.ме может быть и неплохо. Но вообще вся годнота требует знаний в релевантной области, ЯП знать там зачастую достаточно на поверхностном уровне.>Кстати, у меня такое ощущение, что в питере больше рубишных вакансий, вам не кажется? Нет, в ДС явно больше.
Я сам не местный, короче рубибои объясните, как вы делаете что в терминале процент загрузки например пишется в этой же строчке а не в новой. Типа$ updatemodulname updating 98% и проценты как бы в одной строчке меняютсяа не $ updatemodulname updating 95%modulname updating 96%modulname updating 97%то есть не пишет постоянно в новой строчке
>>1325671Кешируется. Делай или STDOUT.flush или STDOUT.sync = true. Но убедись, что понимаешь последствия второго варианта перед тем как его использовать.
>>1325767stdout это просто глобально доступный инстанс класса IO, можешь его доки посмотреть https://devdocs.io/ruby~2.5/io
Хочу вкатиться в Ruby. Какой стек технологий и на каком уровне необходимо освоить, чтобы взяли на работу трейни/джуном?
>>1325810Рандомный (стандартный стек осваивай: реальса реакт скуль линукс охапка популярных гемов) стек осваивай, руби джун вакансий настолько мало, что это чистый рандом в россии.Как вариант набери опыта в PHP-конторе.
Посоветуйте книгу для быстрого изучения основ языка. Лучше на русском, но можно на английском.Нужно для экзамена в университете.
>>1325984СогласенКурс был рассчитан на изучение основ веб программирования и Ruby on Rails По итогу было прочитано много материала по рельсам, но есть непонимание самого языка, поэтому реквестирую книгу по чистому руби без упоминания рельс.
Эх, как вы здесь, без меня потомки? Даже старый файлик с перекататом сохранился у меня.1. C чего мне начать, чтобы стать рубистом?Отличным началом будет Programming Ruby (The Pragmatic Programmers Guide), читать Eloquent Ruby и The Well Grounded Rubyist после прочтения первой толку особо не даст, одни и теже вещи, дальше читаем Ruby Way, затем познаем метапрограммирование с Metaprogramming Ruby. А дальше открываем Ruby cookbook 2015 года, Пишем свой код во время чтения.Следующий уровень, продвинутые книги по руби:Confident Ruby by Avdi GrimmPractical Object-Oriented Design in RubyRefactoring Ruby EditionRuby Under a Microscope для любителей залезть под капот.Документация по стандартным библиотекам http://ruby-doc.org/Можно пройти руби онлайн - http://tryruby.org/levels/1/challenges/0И ещё раз онлайн: http://www.codewars.com/?language=rubyНе веришь в свои силы? Прочитал уже книжек много и силы свои хочешь познать, сделай - http://rubykoans.comИ вот еще https://rubymonk.com/ - Матц одобряет.2. Какой gem посмотреть, чтобы понять, как писать код?Лучше всего посмотреть небольшие gem'ы вроде cancancan, pundit, camping.А еще можешь полистать на гитхабе гемы с нарастающей популярностю.https://github.com/trending?l=rubyТам еще нет тысяч строк, и тебе будет легче понять.3. Есть ли GUI для руби?Да. Есть обвязки к Qt, GTK, wxWidgets, Shoes, fxruby (одобренный).4. Можно ли писать на руби мобильное ПО?Да. Для iOS есть RubyMotion терпимого качества, для Android - лагающий и падающий, но всеми силами развивающийся ruboto. Для WinPhone до сих пор ничего не завезли.5. Как установить разные версии рубей?Легко и просто: https://github.com/sstephenson/rbenvИ это тоже, легко и просто: https://rvm.io6. Что почитать по рельсам?http://guides.rubyonrails.orghttp://ruby.railstutorial.orgAPI: http://api.rubyonrails.orgПрекрасные туториалы в стиле for dummies - http://www.theodinproject.com/ruby-on-rails , а вот тут все тоже, но на русском http://codenamecrud.ru/Классический вводный туториал, где делается с нуля клон твиттера, для новичков в rails самое то - https://www.railstutorial.org/bookДля дотошных читателей есть The Rails 4 Way.7. Хорошие практики по руби и рельсам?Читаем Rails AntiPatterns, смотрим Rails Best Practices, также неплохо посмотреть Rails Recipes.Почитайте еще Grimm A. - Objects on RailsЕще продвинутое чтиво - http://tutorials.jumpstartlab.com/8. Ruby/Rails блоги, рассылки и твитторыIRC каналы на FreeNode: #ruby, #ruby-core, #RubyOnRails, #rails (не очень активен).Твитторы @rails, @dhh, @yukihiro_matz, @wycats, @tenderloveРассылки ruby-core, rails-core, rails-talkПодкасты:- http://rubyrogues.com- http://ruby5.envylabs.comСкринкасты:- http://railscasts.com- https://peepcode.com- https://www.destroyallsoftware.com- http://railsforzombies.comБлоги:- rubyflow.com - каждый день новости, новые библиотеки, обновления, все дела.- rubysource.com - читаем интервью, хорошие практики, и безумные сравнения упоротого дибила-индуса на самом деле их пропускаем- rubyinside.com - новости, туториалы.- rubyweekly.com- http://37signals.com/svn- http://yehudakatz.com- http://afreshcup.com9. Я не могу в английский, что делать, анон?Идти учить английский, без него тут делать нечего.10. Есть ли у руби русское коммьюнити?Нет. Вернее есть, но оно протухло и там полно людей у которых чсв высоко.Яркий пример - ruby@conference.jabber.ruА еще есть русская слак конфа - https://russiandevs.slack.com она общая, но есть очень активный руби канал.Так же русская гугл группа, активная - https://groups.google.com/forum/#!forum/ror2ruЕще вот - https://onrails.club/11. Какие гемы стоит знать?capybara, rack, rspec, devise, cancancan, simple_form, solr, sinatra, тысячи их.Поиск гемов https://www.ruby-toolbox.com12. Зачем нужны тесты и как их писать?http://rusrails.ru/a-guide-to-testing-rails-applicationshttp://habrahabr.ru/post/163597/Вместо этого можно прочитать классную книгу Everyday Rails Testing13. Где можно задать глупые и не очень вопросы?- здесь- stackoverflow.com- тематические slack-конфы- а вообще, гугли, с вероятностью в 90% ответ на твой вопрос уже висит на stackoverflow.14. Как фокнуть\сделать фичу\исправить баг, сложно ли это?Нет, не сложно. На rubyflow появляется много новостей с реализацией новой библиотеки, вы можете сделать тесты, фичу для него, старые либы также обрастают багами, улучшайте их! пишите код.15. В чём писать код?Atom, Brackets, Sublime Text, TextMate, Vim, GNU Emacs. Для особо упоротых энтерпрайз-макак есть rubymine, плагины к эклипс и нетбинс.16. Можно ли писать на руби с под windows?Можно, но придется обрасти костылями в виде виртуальной машины, придется сходу разбираться с Vagrant и многим другим. Чем дальше ты продвигаешься, тем ближе становится ясно, что пора перекатываться на linux/mac17. Руби язык одного фреймворка?Есть еще Sinatra, Hanami (ранее Lotus), Volt, Grape, отличные штуки для DevOps - Chef, Puppet и годные генераторы для бложиков - Jekyll, Middleman, всё это активно используется в продакшене18. Можно ли делать игры на Ruby?Можно, но не нужно. Гем Gosu.19. Ютуб каналыYoutube driven development...Вот тебе пара каналов, но никому не говори что учишься по видео.https://www.youtube.com/channel/UCIQmhQxCvLHRr3Beku77tww/videoshttps://www.youtube.com/channel/UCfWZwsP8trUy5uHJg8gcGIQhttps://www.youtube.com/channel/UCSI77lJlzlCFPLdV1RSAoYQhttps://www.youtube.com/channel/UCPIyDzf1vwWc8EQJGUX-vYw - тут на ру$$ком даже.20. Как и где искать работу?Легко и просто - http://rubyjobs.ru/Не так просто - https://upwork.com/Еще вконтакте есть группы по руби/рельсам, там иногда постят вакансии. Еще в русской гугл группе постят вакансии. Новичку будет сложно, но возможно.TODO лист для ньюфагов:И так, ты поставил руби, уже сгенерировал свой первый проект rails new pidarasНачни уже с платинового пути, блог >> клон твиттера >> своя имейджборда >> свой гем >> дальше сам придумаешь.Рекомендации:1. Для блога, создать роли, Админ, Пользователь (можно использовать паттерн form object). Прикрутить лайки, комментарии.2. По твиттеру, следуя гайду Хартла, пиши все то что он предлагает в качестве доп. заданий, например оповещение по нику (@eblan: привет)3. По имиджборде: воссоздать по возможности полный функционал, в этом случае придется ознакомится с javascript/jquery/coffeescript, но тебе так или иначе придется. Еще хорошей фичей будет использование background job и крон тасков (sidekiq, whenever), чтобы заполнять свою борду тредами и постами с другой борды, можно использовать api двача, чтобы вытягивать треды и посты - https://github.com/ID25/api_2ch4. Не стесняемся постить свои репозитории, наши эксперты с радостью отревьювят вас.После этого тебе будут нужны паттерны, без них твой код превратится в говно. Один из часто используемых - Service Object.https://netguru.co/blog/service-objects-in-rails-will-help - о сервисахЕще паттернов - https://robots.thoughtbot.com/back-to-basics-solidНо самый читаемый код, как и следовало ожидать, даёт функциональное программирование. Начни отсюда:http://www.sitepoint.com/functional-programming-techniques-with-ruby-part-i/http://www.sitepoint.com/functional-programming-techniques-with-ruby-part-ii/http://www.sitepoint.com/functional-programming-techniques-with-ruby-part-iii/http://www.sitepoint.com/functional-programming-pure-functions/http://www.sitepoint.com/functional-programming-ruby-value-objects/Только не переборщи. Руби - не функциональный язык, и иногда такой код может работать медленней.Прочитал? Теперь рефактори то, что уже написал. И не забывай покрывать тестами.Хорошим финалом будет деплой, это пожалуй самое болезненное, и ничего общего с деплоем на heroku, где тыц тыц и готово. Придется поковыряться со смежными вещами и узнать много нового, уже устоявшийся гем для таких дел - Capistrano.Не забывайте спрашивать у анонасов вопросы, код лучше показывать через gist или pastebin с подсветочкой.Ну, а мы открываем очередной Ruby Thread.
>>1326362На самом деле ты прав. Хотел вспомнить свои влажные мечты далекого 15 года.Сейчас увы из-за рынка пришлось перекатится на голанг. Да и платят чуток выше.
>>1324696>А если не стабать, то как тогда? Dependency Injection? Но в таком случае наш объект помимо своих основных параметров должен принимать еще штук пять DI-инъекций. Код превратится во что-то неперевариваемое. dry-rb https://www.icelab.com.au/notes/effective-ruby-dependency-injection-at-scale/
>>1326636>dry-rbПробовал использовать. Какое-то оверинжиниред говно по ощущением. Только валидации и транзакции более-менее понравились.
>>1326644Оно говно, если не писать в стиле автора гемов, но тебе не нужно юзать весь стек, возьми только то, что добавили там для DI
>>1324696>Но есть задачи со сложной предметной областью: когда у моделей/проекта есть жизненный цикл с множеством состояний и ветвистый процесс.Если тебе сложно написать тест для юнита(класс, контроллер, модель, неважно), то значит этот модуль делает слишком дохуя вещей. И лучшее решение в этом случае - это НЕ продолжать писать сложные тесты и думать, какими фабриками-хуябриками их можно сделать читабельнее, а упростить сам юнит. То есть вынести из него часть логики, протестировать эту логику отдельно, а в тесте для юнита проверять только то, что эта логика используется в принципе. >Вот в Рспеке есть стабы и запись типа allow_any_instance_of to_recieve... И оговорка, что вообще-то это прием для легаси кода, и этого надо избегать.>А как же избегать, если тестируемые процессы много от чего зависят.Ну зависят, ииии что? Тестировать надо не объект, а юзкейс. Если твой юзкейс - это создать пользователя в базе, то тесты будут выглядеть вот так:1) GIVEN такие-то параметры1) WHEN я вызываю кусок публичного API(например публичный метод класса, POST /users, обычная функция, и т.д)2) THEN В базе создается юзер с такими параметрами и API возвращает мне юзера в таком форматеЭто все. Тест пишется ТОЛЬКО с позиции пользователя API, будь то юзер на сайте или программист. И соответственно в тесте должна быть только та информация, которая доступна пользователю API. Там не должно быть хуйни вроде "если у меня замокан вот этот класс, замокана БД и вот эта переменная выставлена на 0, то метод в классе вернет :sosi_hui". Потому что это не то, как пользуются твоим API.Пример вещей, достойных моканья:1) То, над чем ты не имеешь контроля в принципе, как API стороннего сервиса, например web API ютуба2) Кусок легаси кода, который ты переписываешь, но не планируешь менять вообщеПример вещей, недостойных моканья:1) БД2) Любой собственный код в проекте3) Любой сторонний код в проекте(либы)Заодно можешь посмотреть отличное выступление, где все эти вещи объясняются более подробно:https://www.youtube.com/watch?v=EZ05e7EMOLM
>>1326636>>1326644Блять, пиздец просто. Не дай бог после таких проект поддерживать.Когда кто-то предлагает драй на полном серьезе, это повод задуматься не то что о профпригодности, а о вменяемости человека.>>1326688Сори, но ты какой-то теоретик в вакууме с предрасположенностью к наставничеству.Написано же было в посте "когда есть сложный контекст". Ну усложни свой пример с созданием пользователя тем, что в случае, если на данный момент недоступен сервис проверки паспорта, то API должно вернуть failure с соответствующим сообщением/кодом.Добавь условие, что если сейчас закрыта регистрация, то опять же соответствующая ошибка.Добавь условие, что "регистрация закрыта" вычисляемое условие. Например конкурс завершен или на конкурсе уже достаточно заявок или на конкурсе уже выбраны команды или на текущем конкурсе только в обеденный перерыв можно регаться.Добавь условие про количество невалидных попыток.И тд и тп. Это еще примитивный случай, тут нет жизненного цикла.Что нам поможет? Либо охуевший DI либо стабы.Либо, если не все идеально распихано по модулям и функциям и нечего застабать, то придется моделировать состояние системы. Его иногда и так придется моделировать.Офтопом:>Если тебе сложно написать тест для юнита(класс, контроллер, модель, неважно), то значит этот модуль делает слишком дохуя вещей. Я, конечно, понимаю, что это была дежурная цитата. Все так, безусловно. Но наверняка найдется будущий художник фрактальных котов. Для таких хочется напомнить про >Ravioli code is a term specific to object-oriented programming. It describes code that comprises well-structured classes that are easy to understand in isolation, but difficult to understand as a whole.
>>1326922PS: Извиняюсь за резкость на счет драя. Анон вероятно просто хотел указать на решения по инжекту. Но драй очень дерьмовое решение, использующим его нет оправдания.
>>1326922Я тебе наоборот дал самые практические советы из личного опыта TDD с минимумом теорий. >Ну усложни свой пример с созданием пользователяЭти проверки выносятся в отдельный модуль/класс, как только ты понимаешь, что через контролер их тестировать неудобно, и в итоге контролер вызывает, например метод check_registration_availability, внутри которого проверяется что угодно: открытая/закрытая регистрация, предыдущие попытки, доступность API. Контролер не ебет, что там проверяется, он просто знает, что если метод вернул availability.success? == true, то можно продолжить регистрацию, если false, то отрендерить availability.errors и завершить выполнение запроса. Внутри модуля проверок их точно так же можно вынести в свои отдельные модули, как только тестировать нюанс каждой проверки становится неудобно. И соотвественно в тестах для контроллера тебе достаточно добавить один простой кейс, что доступность регистрации проверяется в принципе, и что пользователю возвращаются какие-то ошибки, если регистрация недоступна. Потому что это как раз ответственность контроллера. Без нюансов, т.к нюансы уже покрыты в тестах для другого модуля. Я в таких случаях обычно беру из модуля регистрации самый простой юзкейс, который почти наверняка не поменяется, и дублирую его в тесте для контроллера. Либо, если тебе очень не хочется дублировать, то можно вынести данный юзкейс тоже в отдельный модуль и использовать его в обоих тестах. Моки тут только навредят. Если тебе нужно засетапить валидную check_registration_availability, например для последующих тестов внутри контроллера, то ты так же выносишь весь сетап в отдельный модуль(желательно этот модуль хранить рядом с тестами на проверку регистрации, а еще лучше, если тесты на проверку регистрацию этот модуль используют сами), в котором будет метод setup_available_registration, который ты будешь вызывать перед каждым тестом контроллера, где тебе он нужен. Хз, как можно еще более подробно расписать, разве что только кодом.
уже давно пытаюсь во что-нибудь вкатиться и вдруг Постиг понимания что кристал крайне многообещающий проект, и странным образом он практически полностью(?) идентичен по синтаксису с раби. Посмотрел примеры кода на rosettacode, и на кристале они ясны практически как божий день, в отличие от остального туманного говна, в которое надо изрядно вникать. даже в питоноподобную хуйню, она же нечитабельна по сравнению с кристало-раби, ну совсем не читабельна же Проект молодой, но, сука, донатов на него в bountysource $2,502 против $856 на Nim. Который мне, как ньюфагу, поначалу казался охуенно любопытным продуктом. забыл блядь что хотел спроситьТак вот. Мне вообще похуй на веб и всё такое, у меня бекграунд вообще музыкальный, то есть частично хотелось бы заниматься DSP обработкой, и я знаю что там царит сплошной с++. Но я минималист. И глядя на то как, сука, прост код фурье обработки на кристале, может быть и двигло на нём было бы не настолько сложно какое-то (на/до)писать, чтобы сделать, к примеру, 2D игрушку? (вопрос по сути риторический)https://rosettacode.org/wiki/Fast_Fourier_transform#CrystalВроде и под андроид есть для раби какие-то обёртки.не знаю нахуя я это написал, мне по сути нечего спросить, запосчу просто так
>>1327382Хочешь веб и руби - бери эликсир. Хочешь андроид - бери жабу. Хочешь сам не знаешь что - бери питон. "Читабельность" зависит только от уровня твоего знакомства с синтаксисом и от опыта программиста, который писал код, в любом языке.
>>1327392>"Читабельность" зависит только от уровня твоего знакомства с синтаксисом и от опыта программистаНет. Код на каком-нибудь коболе может быть читабельным по-сравнению с другим кодом на коболе, но он никогда не станет таким же читабельным как аналогичный код на том же руби. Потому что в коболе на уровне синтаксиса языка нету возможности написать такой же читабельный код.
>>1327399Если у тебя дохуя опыта написания кода на коболе и дохуя написания кода на руби, то синтаксические конструкции ты будешь читать и понимать с одинаковой скоростью, что там, что там. Это и есть читабельность, она всегда личная и зависит от опыта. Дальше вопрос только в выразительности языка на строчку кода.
>>1327408Точнее эликсир. И слава богу, что феникс не пошел по пути рельс, когда экосистема фреймворка подменяет собой экосистему языка.
>>1327411ну согласись,на руби приятнее читать,код чист от нагромождений,более логичен для человеческого мозга
>>1327382Не надо C++ нет нет нет нет не надо больше нам такого, теперь есть Julia, она умеет на видеокартах считать. И синтаксис на Ruby похож.
>>1327418Знаю про юлию, но как-то не зашла она у меня с позиции новичка. Возможно потом зайдёт после кристало-раби питоноподобный синтаксис (он же в юлии питоноподобен, а не раби-подобен, если я правильно понимаю) удобен для того чтобы на нём писать бухим в говно, но не для того чтобы его потом кто-то читал? Я же предполагаю что мне придётся всё таки читать чей-то код, его фиксить, а если он прям щас у меня почти что зашёл, без знания языка, так потом вообще нормально будет, кпд на единицу времени по итогам будет выше(?)
>>1327450Писать читаемый код - это огромная наука, которую можно освоить только на практике, написав перед этим тонны нечитаемого говна. От языка это зависит очень мало, ты все равно будешь писать хуйню и потом хвататься за голову, когда эту хуйню нужно будет через неделю прочитать и вспомнить, что она делает. Хоть на руби, хоть на джаве. Так что не заебывайся, выбирай язык под задачу, а не по красивости синтаксиса, и иди практикуйся. Потом можешь еще почитать всякие code complete, clean code, чтобы подхватить и сопоставить со своим опытом уже сформулированные концепции по написанию читаемого кода, но полезны они будут только после/во время практики, а не перед ней.
>>1326934>Эти проверки выносятся в отдельный модуль/класс>соотвественно в тестах для контроллера тебе достаточно добавить один простой кейс, что доступность регистрации проверяется в принципеТак а я разве отрицаю? Но мы и приходим к стабамallow_any_instance_of(SomePolicy).to receive(:check_registration_availability).and_return(true)При том это мы говорим об идеальном допущении, что логика была грамотно осознана и структурирована, а внутри SomePolicy отрабатывает еще десяток (без преувеличения, именно для нашего примера) других SubPolicy и все их получилось (!) органично собрать в единый механизм, сведенный к единственному методу.То есть должна быть очень сильная декомпозиция. Например, в коде тестируемого сервис-обджекта не может быть ничего подобного:policy = @user.legal_status == 'phisical' ? PhisicalPolicy : JuridicalPolicyА вместо этого будет обертка типа LegalPolicy:policy = LegalPolicy.new(@user, ...)В противном случае мы уже должны вводить контекст в виде пользователя с какой-то правовой формой.Кстати, тоже хотел давно спросить, как распихивать такой набор по файловой системе? В рельсах нет модульности и если это делать по технической иерархии (policies, models, etc), то получается каша.Другая ситуация - когда мы работаем с жизненным циклом и с какой-то структурой лень сейчас придумывать конкретный пример. Суть в том, что наш модуль должен ответить на один единственный вопрос. Но чтобы ответить он должен проанализировать состояние сложного контекста - функция от нескольких моделей с их сочетанием полей.Или при тестировании query-обджектов, иногда под запрос нужно создать сложный набор.
>>1327524>Но мы и приходим к стабамНе приходим. То есть ты конечно можешь их использовать, но сразу охуеешь, если захочешь поменять структуру кода, не меняя при этом его поведение(рефакторинг). Тесты должны этому помогать, а со стабами/моками ты ломаешь инкапсуляцию, потому что теперь твой тест знает гораздо больше, чем должен(что внутри тестируемого компонента есть конкретная SomePolicy с конкретным методом, который ожидает конкретные параметры), и при этом прочно связываешь тест с конкретной внутренней реализацией тестируемого компонента. Из-за чего менять внутреннюю реализацию компонента будет невозможно, не поменяв тест. Марка качества для теста - это именно рефакторинг. Если ты можешь как угодно зарефакторить комопнент, при этом не тронув ни одной строчки в тесте, и тест при этом останется зеленым, то это хороший тест. В твоем примере придется трогать как минимум один стаб, а скорее всего и еще что-то. Это контрпродуктивно и очень неудобно.>При том это мы говорим об идеальном допущении, что логика была грамотно осознана и структурирована>То есть должна быть очень сильная декомпозиция.В том и дело, что тестам должно быть абсолютно похуй на то, как твоя логика структурирована внутри. Они проверяют конкретные юзкейсы, а не конкретные куски логики внутри приложения. Между этими двумя вещами есть разница. Если, допустим, логика проверки регистрации не засунута в отдельный класс, а написана прямо внутри контролера, то тебе просто-напросто придется писать больше тестов для контролера, которые тестируют эту логику. Как только ты вынесешь логику проверок в отдельный компонент - ты сможешь во-первых протестировать ее отдельно, не дергая контролер, а во вторых удалить из тестов для контролера все повторяющиеся(и до сих пор зеленые) кейсы этой логики, оставив только один.>Кстати, тоже хотел давно спросить, как распихивать такой набор по файловой системе? Распихивать надо так, чтобы вещи, которые меняются вместе, были рядом. В этом плане рельсы и многие другие популярные фреймворки делают полную хуйню. Вместо /models/user.rb/models/role.rb/controllers/users_controller.rb/controllers/roles_controller.rbДолжно быть/user/model.rb/user/controller.rb/role/model.rb/role/controller.rbИ т.д. Просто потому, что в твоем проекте никогда не встанет задача "поменять какую-то хуйню во всех моделях/контроллерах"(а даже если и встанет, ты не будешь менять это в каждой модели, а пойдешь в ActiveRecord::Base), но зато задачи "поменять хуйню в юзерах, которая затронет контролер юзера, модель юзера, сервис юзера и прочее у юзера" возникают постоянно. Со второй схемой ты просто идешь в папку user и меняешь там нужную логику в нужных файлах, а с первой - прыгаешь туда-сюда. Я уверен, что такое относительно просто организовать даже в рельсах с их магией, но сам уже давно рельсы забросил и постепенно переношу свой последний крупный проект на эликсир. Вообще советую тебе попробовать отдохнуть от рельс и написать что-то либо на другом языке, либо на чистом руби. Рельсы слишком извращают мышление и закрывают собой кучу хороших простых практик, поощряя вместо них лютый оверинжинирнг. А в последних версиях там вроде вообще пиздец нагородили.
>>1327568> В твоем примере придется трогать как минимум один стаб, а скорее всего и еще что-то. Это контрпродуктивно и очень неудобно.Слабая связность - не сильвер буллет, ебал я в рот продираться через миллионы тонких классов. Это тоже, знаешь ли, тоже очень неудобно. При разумном использовании стабов поправить один интерфейс в тесте - не так страшно, как ты описываешь. То, что последователи solid будут недовольны - ну а как они с рельсой вообще живут? Стабов не нужно избегать, но пользоваться в ограниченном объёме. Сomplexity класса не может быть слишким низким или высоким, вот и весь секрет.мимо
>>1327568>Не приходим>ты ломаешь инкапсуляцию, потому что теперь твой тест знает гораздо больше, чем должен(что внутри тестируемого компонента есть конкретная SomePolicy с конкретным методом, который ожидает конкретные параметры)Вот теперь я тебя не понимаю. А как тогда тестировать кейс, когда логика внутри тестируемого юнита зависит от результата другого юнита? Ну то есть как тогда проверить, два сценария: 1) Policy вернула true 2) Policy вернула false, не создавая при этом соответствующих условий для нее?>Распихивать надо такДа, но если внутри есть суб-директории без скоуп-модулей, то автолоадинг перестает работать. Я сейчас сам прелоадю, но это как-то не очень красиво. инбифо, трейлблейзер идет нахуй>>1327906Хорошо сказал про классы. Двачую. Только я не понял, почему "связность". SRP имелось в виду?
>>1327906>Слабая связность - не сильвер буллет, ебал я в рот продираться через миллионы тонких классов. Поэтому ты и пишешь вещи сверху-вниз, вынося в отдельные классы/паттерны/модули только тогда, когда это реально оправдано, улучшает читаемость или помогает внедрить изменение. И тесты в этом отлично помогают, если они конечно не замоканы.>Стабов не нужно избегать, но пользоваться в ограниченном объёме.Тут еще есть проблема в понимании определения стабов. Стаб - это затычка. Например, у тебя есть функция, которая требует 3 аргумента, но ты знаешь, что последний аргумент в данном тесте использоваться не будет вообще. И ты даешь этой функции стаб. Чем он проще - тем лучше. У стаба не должно быть никакой логики, он должен соотвествовать абсолютному минимум требований. allow receive - это не стаб, а полноценный мок с поведением. Стабы - это нормально, но они все равно используются довольно редко(и если тебе реально нужен стаб, то ты можешь его написать сам за минуту, без всяких мокинг либ). Моки - это не норма, а исключение, и должны использоваться еще реже, чем стабы.>>1328287> А как тогда тестировать кейс, когда логика внутри тестируемого юнита зависит от результата другого юнита? Ну то есть как тогда проверить, два сценария: 1) Policy вернула true 2) Policy вернула falseСценарии должны звучать не как "компонент вернул true/false", а соотвествовать юзкейсам. Например, в контроллере у тебя были такие юзкейсы(и, соответственно, тесты для них)a) Если регистрация закрыта, то API вернет ошибку 1b) Если не проверить паспорт, то API вернет ошибку 2c) Если не проверить еще что-то, то API вернет ошибку 3d) Если регистрация открыта, паспорт и все остальное проверны, то API вернет что-то другое... и т.дТы решил упростить контроллер и вынести пункты a-d в свою Policy. Для этого ты: 1) написал Policy2) написал для нее тесты(по сути просто скопировал нужные тесткейсы из контроллера и подправил API). 3) Интегрировал Policy в контролер и убрал из контролера весь повторяющийся код4) Прогнал все тесты для контролера, они должны быть зелеными.5) Начинаешь убирать все повторяющиеся тесты внутри контроллера(эти тесты ты вынес в Policy на шаге 2). И вот тут важный момент - в контроллере нужно оставить тот минимум тестов, которые позволят тебе с уверенностью знать, что Policy контроллером на самом деле используется. Например, в контроллере остались тесты юзкейса а), юзкейса d) и нужный сетап для этих тестов.6) Так как сетап повторяется и внутри тестов контроллера, и внутри тестов Policy, его логично и удобно вынести в общий модуль, который будет этими тестами использоваться7) Опционально можно вынести оба повторяющихся теста в такой же модуль. Но можно и не выносить, если тесты очень простые и проверяют те юзкейсы, которые почти наверняка никогда не будут меняться. Подобный процесс требует не сильно больше усилий, чем моканье, но при этом не привязывает твой код к текущей внутрней имплементации, и такие тесты будут ломаться только тогда, когда сломался реальный юзкейс, а не левый мок.>Да, но если внутри есть суб-директории без скоуп-модулей, то автолоадинг перестает работатьЭто уже рельсопроблемы, тут ничего посоветовать не могу.
>>1327286Комментарий о том, что в питон встроены удобства для прямой работы с DI. В коментарих к коментарию пишут, что это не правда. То же и о руби. Я не понял, как инфа по ссылке отвечает на мой вопрос. Можешь подробнее?
>>1328874Тебе не нужен целый DI-фреймворк, как в джаве, если ты и так можешь инжектить что угодно и куда угодно в рантайме.
>>1328895Понял твою мысль, но инджэктить с десяток зависимостей в каждом вызове не удобно, для этого нужна та либа.
>>1328979Возможно твоя проблема как раз в том, что тебе в принципе приходится инжектить по 10 зависимостей на вызов, а не в том, что это делать (внезапно) неудобно.
>>1328808В общем, если я тебя правильно понял, ты предлагаешь создавать соответствующие условия (контекст). И чтобы не делать это каждый раз - выносить в модули.Но в этом и заключался мой изначальный вопрос в самом первом посте - как создавать сложные условия.Я же с самого начала написал, что это либо DI/стабы ок, моки либо моделирование условий.
>>1328895>если ты и так можешь инжектить что угодно и куда угодно в рантаймеВот тут уже не понятно: или мы под инжектом понимаем разные вещи или в чем разница-то между явой и руби?опять другой анон
>>1328999>либо моделирование условий. Так моки это и есть моделирование условий, просто с ними ты привязываешься к текущей имплементации, получая взамен только иллюзию, что якобы так будет проще поддерживать код.
>>1328997У тебя есть сервисоббджект который вызывает несколько других сервисобджектов, каждый из которых вызывает еще несколько. Вот внезапно и набирается с десяток зависимостей.
>>1329055И для чего именно тебе нужно инжектить зависимости в каждый из этих объектов? Я такой случай представить вообще не могу.>>1329001Зависит от того, что именно ты инжектишь, куда, и зачем.>>1329006В том, что в руби тебе не нужно хуячить никакую спецификацию для твоего DI(XML, аттрибуты и т.д), чтобы удовлетворить компилятор. Ты просто берешь и инжектишь без задней мысли.
>>1329064>И для чего именно тебе нужно инжектить зависимости в каждый из этих объектов? Я такой случай представить вообще не могу.На вход тебе приходят три параметра. Для каждого из них нужно сделать следующее: произвести вычисления, сохранить результат, отправить отчёт, всё это залогировать. вычислениесохранениеотчётлогированиеИ так три раза Ты выносишь эту последовательность в отдельный сервис. Вычислениями занимается также отдельный сервис. Сохранением тоже, логированием тоже, и отчётом. Твоему модулю не нужно знать, с помощью чего будет происходить логирование, ему не нужно знать, куда будут сохраняться данные, по какому каналу отправлться отчёт. Поэтому твой сервис на вход получает класс отвечающий за вычислени, класс отвечающий за логирование, класс отвечающий за сохранение, класс отвечающий за формирование отчета, класс отвечающий за его отправку. И в твоем верхнеуровнем методе/контролере множество таких классов, которые вызывают методы других классов, вызывающих методы других классов.
>>1329075И что именно делает самый верхней модуль, если он ничего не знает, а только делегирует все задачи, сам не зная куда? Для чего он существует и почему ты не можешь убрать из него все инъекции и добавить эти зависимости напрямую? Чтобы настолько пиздецовые абстракции были оправданы, нужна очень сложная архитектура, в твоем примере ее нет.
>>1329083>И что именно делает самый верхней модуль, если он ничего не знает, а только делегирует все задачи, сам не зная кудаЭтим и занимается. >Для чего он существует и почему ты не можешь убрать из него все инъекции и добавить эти зависимости напрямую?Добавил зависимости напрямую - усилил связанность классов. Привязал свой класс к другому классу. Это конец. Твой сервис уже сложнее использовать в другом контексте, потому что он содержит в себе контекст. Ты уже не можешь динамически выбирать способ отправки отчёта - он зашит в твоем модуле. Нет, конечно ты можешь в своём сервисе указать не класс, отвечающий за нотификацию, а класс, выбирающий способ нотификации. Да? Но как он будет выбирать. Ему какие-то данные нужны. Значит эти данные придется тащить внутрь твоего сервиса. https://en.wikipedia.org/wiki/Coupling_(computer_programming)>Чтобы настолько пиздецовые абстракции были оправданы, нужна очень сложная архитектура, в твоем примере ее нет.Мой пример достаточен, для того, чтобы продемонстрировать идею, а умножить сложность в пару сотен раз ты и сам сможешь в своей голове, достаточно представить, что то, что я тебе описал - небольшая часть большого проекта. Она кажется простой, потому что вырвана из контекста. И я могу себе позволить вырвать её оттуда, потому что наш модуль ничего не знает о процессе формировани отчета и т.д. Отдельно он выглядит не таким уж и сложным, и реализовать его хочется просто, только это обманчивая простота.
>>1329088>Добавил зависимости напрямую - усилил связанность классов. Привязал свой класс к другому классу. Это конец. Твой сервис уже сложнее использоватьНаркоман? Использовать сложнее как раз те вещи, которые требуют какого-то предварительного сетапа или кучи условий для их работы. >Ты уже не можешь динамически выбирать способ отправки отчёта - он зашит в твоем модуле. Или вместо дрочки DI ты можешь добавить выбор отправки отчета в обычное API своего модуля, например notify_via: :email. >Отдельно он выглядит не таким уж и сложным, и реализовать его хочется просто, только это обманчивая простота. Весь новый функционал и должен реализовываться самым глупым-прямолинейным-простым способом, который покрывает только необходимый минимум условий. Усложнять этот функционал лишними абстракциями нужно только по мере надобности: когда падает читабельность, когда сложно добавить новый юзкейс и т.д. То, что ты описываешь - это классический оверинжинирнг, который приводит к лютой лапше. Декаплинга, паттерны и прочие абстракции - это не вселенское добро, которое нужно юзать при любом пуке, у них есть свои, часто немаленькие, трейдофы.
>>1329094>Или вместо дрочки DI ты можешь добавить выбор отправки отчета в обычное API своего модуля, например notify_via: :email. И чем это отличается от передачи класса? Ты всё также передаешь параметр, только теперь тебе внутри еще нужен код, который твой email развернёт в класс. >Наркоман? Использовать сложнее как раз те вещи, которые требуют какого-то предварительного сетапа или кучи условий для их работы. Наркоман? В этом примере как раз таки по условию много условий, определяющих какой код будет выполнен, тебе в любом случае все придется параметризовывать. >Усложнять этот функционал лишними абстракциями нужно только по мере надобностиВ указанном примере надобность есть. Ты меня троллируешь?
>>1329099> Ты меня троллируешь? Он тебя не троллирует. Если тебя корёжит от захордкоженного класса, то предусмотри переопределение соотв. аттрибута в инициализаторе инъекциями, конфиг-классами, магией.
как же я обожаю раби, серьезно, пописал немного на ноде - да, прикольно, но не то, сейчас опять пилю на рельсе - какая же она кайфовая, язык богов
>>1329016>>1329064>Так моки это и есть моделирование условий>Зависит от... Ты просто берешь...Какой же ты демагог.>>1329083>Для чего он существует ... в твоем примере ее неИ дилетант.>>1329094>например notify_via: :emailСука, еще и рельсо-магическо-головый. Типичный devise-style. Из этого сразу понятно насколько сложные вещи тебе приходилось делать, точнее не приходилось.>>1329094>Весь новый функционал и должен реализовываться самым глупым-прямолинейным-простым способом>Усложнять этот функционал лишними абстракциями нужно только по мере надобностиВот тут вынужден согласиться. Только не в кассу, речь не об этом.>>1329099Он не тролирует, он похоже не очень разбирается. Эдакий эффективный аппер-интермидд, судя по тону в сеньоры стремящийся.По теме: мне кажется такие ситуации можно решать каким-нибудь оркестратором. Вся задача которого будет в том, чтобы настроить зависимости - повесить лиснеры, в зависимости от опций прокинуть клиенты, адаптеры там всякие - и вызвать непосредственно рабочий объект. И как бы получится, что под капотом "движок" настраиваемый, а снаружи лаконичный интерфейс для вызова. И для каждого случая свой такой оркестратор, но чаще он будет один или с парочкой параметров.Да, получается, что тут вроде как нет DI. Но блин, это же правда невозможно, определять туеву хучу зависимостей прямо при вызове, да еще и каждый раз.Мне кажется DI это больше про глобальный конфиг, про инициализацию программы: хотим Pg или Mysql или CSV, ага? лол, такой логгер или другой, какой мидлвар использовать, с какой моделью работать (как девайс делает).А что касается тестов, то мне кажется DI тут все равно не поможет. Ну вот есть механизм в dry-rb, ну и в чем разница замокаю я вызовы или буду использовать эту ебалу с зависимостями.
>>1329099>И чем это отличается от передачи класса? Ты всё также передаешь параметр,Тем, что теперь твой клиент не знает ни о каких левых классах, а полагается только на публичное простое API>>1329808>Сука, еще и рельсо-магическо-головый. Типичный devise-style.И к чему ты это кукарекнул? Где тут хоть какая-то магия?
>>1329808В 9 из 10 случаев объект пишет в стандартный логгер, на 10 раз тебе дали таск завернуть обращение, например, в телеграмм. Соответственно, 9 раз указывать логгер явно не нужно, ты его хардкодишь, как дефолтный. А на 10 случай пишешь: MyService.new(:customLogger => TelegaLogger.new). Внедрение зависимости используется для понижения связости и переопределения частных случаев за счет повышения сцепленности (coupling). Остальное комментировать не буду, тебе ещё много учится)мимо недемагог
>>1329944Если говорить конкретно про пример логирования, то это решается немного другими приемами. Сувать такое в конструктор как-бы моветон.И ты путаешь связность и зацепление (и по русски и по английски путаешь). Хотя возможно и понимаешь суть.Сори, но ты-таки демагог.
>>1329950Ничего страшного, но я не буду пролжать общение, т.к. не увидел ни 1 аргумента с твоей стороны. Добрых выходных!
>>1329952Тут несколько людей независимо общаются, и никто не подписывается. Какие аргументы тебе нужны? Я выше привёл хорошие аргументы, которые ты или кто-то другой разбил в пух и прах ответами "слишком сложная структура" и "логирование через стандартный логгер". Пример нужен был для наглядной демонстрации идеи, а ты стал доебываться до синих занавесок. В споре может быть и рождается истина, но не в таком. Я начал с тобой диалог, потому что думал, что у тебя есть какая-то новая, интересная мне информация, а ты всего-то хочешь доказать, что ты прав, ну и хуй с тобой тогда. Эта беседа максимум тебе полезна. >>1329808>Ну вот есть механизм в dry-rb, ну и в чем разница замокаю я вызовы или буду использовать эту ебалу с зависимостямиЭтот DI нужен только для удобства. Ты все равно будешь мокать, но в этом случае моканье будет более комфортным. У тебя два варианта: либо воссоздавать всю структуру, добавлять в базу десятки объектов для одного теста, либо обмазываться стабами. Если это модульное тестирование - лучше всё стабить, а потом в интеграционном тестировании проверять связи между объектами и общую работоспособность создавая реальные объекты - никаких стабов. Если ты используешь rspec, думаю, тебе стоит попробовать вынести создание double'ов в отдельный модуль. Сделать аналог FactoryBot, но только для double'ов. Так как у тебя моки и стабы повторяются по проекту, их надо куда-то вынести. У тебя в любом случае пердак будет гореть от тестов, DI, не панацея, он чуть упрощает этот процесс.
>>1329967>Сделать аналог FactoryBot, но только для double'овХмм... это идея. Правда не могу с ходу придумать, как это может выглядеть. А ты пробовал такое?
>>1329972Да. В spec/support/ кидаешь все свои вспомогательные классы. Например, есть определенное состояние, достаточно типовое, встречающиеся много раз в проекте, но для того, чтобы его получить, тебе нужно создать несколько различных записей в бд, установить какие-то настройки, добавить какие-то стабы и т.д. Ты это все вытаскиваешь в один метод и потом спокойно вызываешь его в тестах.
>>1329950>Сувать такое в конструктор как-бы моветон.Это кто тебе сказал? Если тебе нужен кастомный логгер внутри одного отдельного объекта, то его легче всего засунуть в конструктор этого объекта, а не придумывать заранее целую систему инъекций или хуй знает чего.
>>1330312че странного, хотелось бы пропустить этот этап, кучу гемов перепрописывать сначала для 5, а потом для 6
>>1334097Хорошей поддержки руби не существует в природе, язык слишком динамичный для этого. Бери или vscode или atom. Мне лично atom больше нравится, хотя в последнее время его стало модно обсирать и популярность у него уже не та. Но в плане UX он наголову выше vscode как по мне. Один мега уебищный поиск в vscode чего стоит. vscode использую только на домашнем ноуте, так как atom на нем тормозит.
>>1335062На уровне RubyMine нельзя. Но как по мне, даже в RubyMine оно хоть и лучше конкурентов, все равно настолько уебищное, что смысла в нем нету. Так что я просто использую autocomplete-plus (установлен по-дефолту) с включенным дополнением из всех открытых файлов. На работе проект около 100к LOC и 500 моделей и мне этого хватает.
>>1335485Первая наследуется, а вторая нет. И, соответственно, если ты поменяешь переменную класса в сабклассе, то она поменяется и в родителе. Сложно представить зачем такое поведение вообще может понадобится, за 5 лет я вообще ни разу не видел переменных класса в продакшен коде, только инстансовые переменные класса.
>>1335493>>1335493спасибо,что объяснил,про это в обучающих материалах не упомянули,я не мог понять нахера исп переменную класса
>>1335202То есть ничего подобного IntelliSense для Руби нет? Печаль. Сделаю, как ты написал. Спасибо.
>>1335126Вот это хороший вопрос на самом деле.Я недавно сам стал задумываться о плюсах и минусах рельс. Я кроме рельс ничего не видел, а очень хотелось бы сравнить с джанго. Было бы здорово поговорить с человеком который плотно поработал и с тем и с другим.Вообще очень заебала рельсо-магия и упорное отрицание сообществом ооп-практик и солида. А в питоне и джанго я сылашал с этим получше и есть модульность, которой так не хватает рельсам.С другой стороны я слышал что они там отсталые все, обратно-совместимые с неудобными миграциями и всякое такое.
>>1336010фреймворк многие велосипедные места сделал за тебя,высокий уровень абстракции.минус-хуже с тонкой настройкой
>>1336010Функционал, который работает просто-таки магическим образом, принцип работы тщательно спрятан за условными договоренностями и в самых неожиданных местах, который сильно опирается на контекст (чтобы все лишнее спрятать) и который сложно/нельзя кастомизировать.Как пример devise. Хорошее коробочное решение, до тех пор, пока не понадобится что-то поменять.Разные acts_as_*, многочисленные магические DSL, всякие договоренности о том что :symbol работает так, а 'simbol' иначе, всякие охуевшие хуки при наследовании/включении/расширении.Причем часто это очень хуево сделано под капотом. Авторы предусматривают какой-то один очень тупой сценарий и даже при желании нельзя изменить поведение.Включаешь какой-нибудь auditable (трекает изменения моделей) и пишешь в модели `audit :phone, :email, ...`. А потом задумаваешься, а что, это стало быть во всех моделях этот функционал проинжектен? Да блять, они тупо расширили ЭктивРекорд. Потом такой думаешь, ну ок, я как-нибудь сам оберну треканье, тем более мне это не в контексте самой модели нужно сделать, дайте мне тот класс, который за это отвечает. А хуй тебе - смотришь, а там блять просто лапша методов, которая тупо инжектится в модель, это даже не сервис-обджект. И начинаешь, понимать, почему они написали какую-то ебалу для того чтобы переопределить current_user - потому что там все сплошь контекстно-зависимое.Хотя либа полезная и по сути очень простая. Но эта ебаная магия головного мозга в головах у рейлс-сообщества им не позволяет создавать модульный, расширяемый, переиспользуемый код.
>>1336054Ты прав, но этот рак давно уже распознали и большая часть комьюнити старается с ним бороться. Вместо devise есть sorcery. Audited пишется в 50 строчек под себя или вообще на триггерах делается paper_trail, кстати, погибче, посмотри в его сторону. А за попытку подключить всякие acts_as_huita в любой нормальной команде тебя в момент обоссут с ног до головы.
>>1336113Не знаю я, мне кажется этот багаж еще долго будет тянуться за рельсами. Да и сами рельсы и сам DHH этому крайне способствуют. Пожалуйста, полюбуйтесь - https://api.rubyonrails.org/classes/ActiveRecord/Suppressor.html.Алсо, покажите мне, пожалуйста, команды, где обоссут за такой код, хочу туда устроиться.
>>1336139>Не знаю я, мне кажется этот багаж еще долго будет тянуться за рельсамиДа, это так. Вообще я был бы рад, если бы DHH ушел уже из рельс и перестал всякую хуиту пихать в них. Suppressor, кстати, мой любимый пример подобной хуиты от DHH. Но и других хватает: только из-за него sprockets до сих не выпили, в 6 рельсах зачем-то впихнут ActionText в core, почему нельзя было сделать это просто отдельным гемом для интеграции с npm пакетом (trix) не понятно, продвижение идеи, что если распихать жирную модель по concerns, то она типа перестанет быть жирной.>Алсо, покажите мне, пожалуйста, команды, где обоссут за такой код, хочу туда устроиться. Данон же. Но вообще большинство приличных контор в ДС пишущих на руби: поток, рокет, инстамарт, whelly, маил, марсиане хоть я и не люблю этих ЧСВшных пидоров. И ты всегда можешь спросить на собеседование про проект же, если окажется, что там fat models по 1к+ строк, то просто откажешься и все.
>>1336174>Но вообще большинство приличных контор в ДС пишущих на руби: поток, рокет, инстамарт, whelly, маил, марсианПоток Rоток, как там, Канаева уволили? хуй знает. Судя по описанию вакансии там разброд и шатание. Драй-рб блять. Эликсир, которого будет больше. Короче позатащили чего смогли и не знаю что с этим делать.Рокет, инстамарт как-то неинтересно совсем.Wheely вообще не рельсовые насколько я знаю. Когда я туда собеседовался года два назад, они мне показались довольно деревянными. У нас монга, а зачем выбрали - ну исторически так сложилось, у нас синатра и мы только недавно начали использовать сериалайзеры для ответов в апишке и тп. То есть рельсы им на каком-то идеологическом уровне не нравятся, но при этом своих велосипедов они сделать тоже не умеют. Легаси-код, легаси-задачи. А сейчас насколько я знаю они уже полиглоты стали, микросервисы там.Марсин боюсь, они какие-то крутые слишком. Ну и удаленщики, а я так не умею.А что майл? У них же вроде нет рубишных проектов?
>>1336207Ты похоже рынок вакансий в ДС лучше меня знаешь. Я сам уже 2 с лишним года на удаленке на иностранную контору работаю и не особо в курсе рыночка. До этого в двух относительно ноу-нейм конторах работал в ДС и уже тогда там никаких acts_as не было, так что думал, что уж крупных командах таких проблем точно не должно быть.>А сейчас насколько я знаю они уже полиглоты стали, микросервисы там.Да я под офигел от их списка "желательных" языков, когда они в последний раз меня звали - ruby/go/js/scala/python.>А что майл? У них же вроде нет рубишных проектов?Сейчас вакансия в платежку висит (+ go), geekbrains да зашквар лютый, я знаю у них на руби, помню в прошлом году еще что-то видел.Рокет по-моему интересным может быть, интересно же как вся эта банковская кухня работает. Но слышал, что у них ехал овертайм через овертайм.
Блять, хули вы так мало постите суки. Я уже заебался тред обновлять - нихуя блять нет новых постов. Что вы за уебки блять такие.
>>1337467А вот интересно, все рубисты рашки тут сидят (ну или периодически заходят)? Ведь время от времени ололокают все, кого я знаю.
>>1337480Думаю и пяти процентов не наберётся. У нас на проекте из 5 рубистов максимум ещё один чел в курсе про борды.
>>1337480Тут нечего делать нормальным рубистам. Тред для них совершенно бесполезен, разве что от скуки зайти и что-то написать, поэтому тут так вяло.
>>1337536Где вообще русскоязычное комьюнити рубистов сидит? А то я вроде в руби уже давно, но с местным комьюнити, не считая rails club, почти и не контактировал никогда.
>>1337592>по настоящему дружного>по настоящемуВсе по Фрейду, хаха.Значит правду про вас говорят.Да и картинка в оппосте строго по дедушке :3
>>1337569Не знаю, да и какая разница? Обсуждать нечего. Руби очень простой язык. Задачи крайне однотипные. Большинство проблем решаются выбором правильного инструмента (гема, вебсервера, базы данных). Расти как рубисту некуда, потому что большая часть нужных технологий, умение работать с которыми повышает твою ценность на рынке, не привязана к какому-то конкретному языку.
>>1337685Да, но мы же при этом используем сруби. И могли бы обсуждать инструменты, практики, подходы именно в контексте работы в рубях.
Хочу заняться backend разработкой. Какие перспективы меня ждут в ruby? Или лучше выбрать тот же php или node.js, питон?
>>1339263>Какие перспективы меня ждут в ruby?Сначала будет болеть, но потом привыкнешь и станет нравиться.
Блин, посоны, я не мог этим не поделиться - https://hh.ru/vacancy/29861666Разработчик Raby on Railsот 80 000 до 100 000 руб. до вычета НДФЛОАО Точных Приборов, НИИ>Обязанности: Разработка программного решения, предназначенного для:>-развертывания и управления сетевой инфраструктурой (FOREMAN,DNS,FREEIPA,TETR,DHCP и т.д);>- развертывания и управления функционированием программного обеспечения;>- развертывания серверов/рабочих станций (bare metal) и виртуальных машин различных провайдеров виртуализации;>-мониторинга работоспособности аппаратного и программного обеспечения;>-централизованного журналирования событий в работе аппаратного и программного обеспечения,>>Требования:>-Опыт RoR-разработки от года>-знания HTML/CSS,JavaScript, CoffeeScript,jQuery, Slim,Sass>- Умение писать тесты Rspec, Capybara>-Знание gem`ов Devise,Pundit,Sidekiq,>-Плюсом будет решение задач по администрированию Linux, базовые знания по сетям. виртуализации и автоматизации разработки и развертывания ПО, окончание курсов по RoR.>>Условия: На предприятии имеется своя медсанчасть, профком, турклуб. Работа с 9.00 до 17.40,>Выходные -суббота, воскресенье. Оплата труда -два раза в месяц
Парни, если кто-то работал или как-то знаком с этими конторами, расскажите. Сижу смотрю вакансии и за их формальным описанием сложно понять что от них ждать.Qlean.СтиркаAMarketsOVERTEAMPiRL VenturesЛэндинг Солюшн Групп aka CashWagonЦентр недвижимости от Сбербанка, ДомКликTalentTechРево-технологииБизнес партнерinShopper, Mail.Ru Group
>>1339368Прикольно так-то, для дауншифтинга самое оно, после смены с михалычем и петровичем в подсобке прибухнуть.
>>1340035Это тип данных, у которого реализованы 3 функции (return, join и bind) которые должны подчиняться определенным законам. По ссылке не монада, там этих функций вообще нет.
>>1340475>Это тип данных, у которого реализованы 3 функции (return, join и bind)Что-то ты придумываешь.https://en.wikipedia.org/wiki/Monad_(category_theory)
>>1341009По ссылке нет упоминаний никаких методов. Я написал код изучая книгу по теории категорий. Если есть замечания к коду с точки зрения терката, мне интересно.
>>1341184>объясните мне что это такоеКоротко не объяснишь, если правда интересно, то читай http://learnyouahaskell.com/chapters. Если лень читать все, то можешь попробовать прочесть только 11 и 12 главу, получится или нет зависит от уровня твоего знакомства с функциональщиной.>что он там написалХуиту.>зачем оно нужно? Не нужно, как и все остальные монадки в языках без компилятора, которой бы проверял за тобой, что ты не обосрался.
>>1341189>Коротко не объяснишьНу камон, анон написал там 30 строк, я не верю, что чтобы понять смысл нужно прям идти функциональщину и теорию категорий учить.
>>1341194Ты понимаешь про что я. Нахуй он эту ебалу написал, в чем прикол, зачем называть какими-то монадами структуру c флагом success/failure?
>>1341192Понимаешь ли, ты задал два вопроса:>Что это?На этот просто ответить. Это монада Either хотя я согласен с аноном выше, что у нее должно быть хотя бы еще пару методов, что бы таковой называться.>Зачем это?На этот вопрос ответить намного сложнее. Если очень коротко, то нужны они для того что бы безопасно и выразительно описывать сложные операции в языках с развитой системой типов. Так как в руби нету развитой системы типов, а уж о безопасности без компилятора тем более речи идти не может, то в руби они не нужны. Зачем они нужны в том же хаскеле читай по ссылке в моем предыдущем посте.
>>1341196Насколько я понимаю он тоже перезагружает весь проект целиков каждый раз. Этим и не подходит, слишком медленно.
>>1341200Я, честно говоря, еще не пробовал Ханами в работе вообще. Смотрел доки, примеры кода. После "магии" рельсов и идей поехавшего dhh-а Ханами выглядит интересно. Сейчас разбираюсь с ROM-rb чтобы им заменить сраный ActiveRecord, а после вместо рельсов - Ханами. А может быстрее в Эликсир перекачусь. В мире руби проекты практически все на рельсах, в Эликсир перекатиться может быть проще чем в Ханами.
>>1341199Ладно, буду считать, что монады это что-то типа гипотезы Пуанкаре и понять ее без предварительного изучения каких-то там разделов математики невозможно.
>>1341202В реальных проектах на рельсах опытные люди стараются просто не использовать совсем хуевые части AR, типа всякие suppress, before/after_save/create/etc, десятков методов для сохранения объектов в базу только save, максимум еще update, стараются по минимуму добавлять методы в модели, некоторые идут дальше и не используют валидации и scope. Webpacker вместе с assets pipeline, тоже сразу на помоечку отправляется, благо это можно сразу в rails new указать. Остальные части рельс вполне годно сделаны как по мне.Эликсир с фениксом в целом годные, но там своей хуиты тоже хватает.
>>1341206Спасибо, опытный человек, что поделился своей мудростью. Кроме suppress, про который знает каждая собака, потому что про него в блогах писали, есть еще много мест где ты будешь тратить время на борьбу с рельсами, а не создание ценного кода.
>>1341209Ну-ка, например!Назови такие места и не забудь провести параллель с ханамями, где ты будешь тратить время на написание велосипедов.Вообще-то проблема рельс не техническая, а идеологическая.
>>1341218Предыдущий пост другой анон написал. Но я с ним согласен. Пишу рельсо-код каждый день и ни с чем не борюсь. Реально единственная неслишком хорошо сделанная часть рельс это AR из-за слишком большого API. Но если использовать адекватное подмножество AR, то рельсы все так же охуенны. Не знаю с чем можно бороться в остальных частях фреймворка.Что ты так полыхнул-то на ровном месте, я же не один suppress указал.
>>1341222ActiveSupport. Monkey patching, monkey patching everywhere. View helpers. Осознанное стремление dhh-a привязать бизнес-логику к фреймворку. Утяжеление приложения из-за того, что в рельсу пихают всякое нинужное говно. inb4 сейчас расскажешь что всё решаемо
>>1341239>View helpersНикогда, НИКОГДА не было необходимости засунуть туда больше трех методов. А когда было нужно, было охуенно удобно. Бугурта декораторо-головых не понимаю - никто ж не запрещает делать по другому. реально не понимаю, что все привязались к этим хелперам>ActiveSupportОпять не понимаю бугурта. Что там такого плохо? Знаю из блогов концерны не нравятся людям. Ну я их никогда и не использую, например, пишу PORO. Расширения базовых классов охуенны. До того охуенны, что от раза к разу что-то мигрирует прямо в руби.>Monkey patchingНужно признать, что внутри движка кромешный ад, это правда. Но машина работает как часы и меня мало волнует как оно там внутри устроено.>Осознанное стремление dhh-a привязать бизнес-логику к фреймворкуИдеологические проблемы, это да. Это беда рельсовой экосистемы.
>>1341250>Но машина работает как часы и меня мало волнует как оно там внутри устроеноКогда занимаешься проектами уровня блог за 15 минут, это нормально.
>>1341239>ActiveSupportА что там плохого-то?>Monkey patching, monkey patching everywhereНу давай рассказывай как ты каждый день борешься с present? у Object и second у Array. Я тоже, конечно, против money patching, но именно фреймворку по-моему позволительно добавить некоторые методы общего назначения в стандартную библиотеку. И как уже сказали выше некоторые из них кочуют в руби.>View helpersСогласен. Года 4 уже ничего кроме json рельсами не отдавал и как-то забыл об их существование просто.>Осознанное стремление dhh-a привязать бизнес-логику к фреймворкуЭто чисто пропаганда от dhh. В самом коде рельс ничто тебя не заставляет так делать.>Утяжеление приложения из-за того, что в рельсу пихают всякое нинужное говноSrsly? Когда у тебя приложение с сотнями и тысячами классов, то пофиг уже на несколько десятков лишних классов от рельс. Да и чистое рельсовое приложение около 100 метров всего жрет, насколько я помню, вполне вменяемо.
>>1341297>Когда занимаешься проектами уровня блог за 15 минут, это нормально.Вот это ты погорячился сейчас. А раз уж ляпнул кукарекнул, точнее, то будь добр, приведи пример из практики, когда тебя волновали внутренности движка.
Ребят, вот тут вы пишете коллбеки зло, а что делать? Вот у меня так - есть поле completed_count, которое хранит количество записей в связанной модели, ну как из counter_cache, только условие тут кастомное, так как его высчитывать без коллбека при добавлении записи?
>>1342389Бизнес логику хранишь в сервисобджектах. Добавление записи в твою модель через отдельный сервис, в котором после добавления обновляется твой completed_count. Но в твоем случае я бы скорее всего забил и делал также, как и ты. Или еще хуже - хуйнул бы все через триггер в постгре.Я еще тот дебил.
>>1342191Э нет, не уводи в сторону. Приведи пример, когда это создало тебе проблему. Именно рельсовый движок, а не гемы и патчи от васянов.>>1342389Колбеки зло, если их ответственность выходит за рамки объекта. Их можно (наверное, даже нужно) использовать, если они работают с внутренним состоянием объекта. Хороший пример - простановка дефолтного значения. На счет счетчика хз, зависит от счетчика. Если случай простой, то я бы тоже сделал коллбеком.>>1342524>хуйнул бы все через триггерНаучи. Как вы поддерживаете эти триггеры, помните о них, ну как вообще с ними работаете? В рельсах-то о таком не принято говорить.
>>1342590>Научи. Как вы поддерживаете эти триггеры, помните о них, ну как вообще с ними работаете? В рельсах-то о таком не принято говорить.Мы о них помним только потому, что периодически пьём курс витаминов, правильно питаемся, хорошо спим и занимаемся бегом. Я существо ленивое, далекое от самосовершенствования, и стал заботиться о себе только после того, как пол дня потратил на выяснение "какого хуя". Хуя оказалось такого, что у нас в постгре триггеры наебенены по самые помидоры, а мы про это забыли. Еще говорят документация помогает, но я не хочу использовать костыли для мозга, слишком гордый для этого. Триггеры в постгре - альтернатива коллбэкам в рельсах. Ящитаю так: если тебе нужно какую-то бизнес логику добавить в триггеры или коллбэки - тебе это не нужно. Пиши нормальную класс под это дело. Если тебе нужно манипулировать какой-то информацией, которая более техническая, чем практическая (пример из вопроса анона про счетчик). то как ты это будешь делать - через триггер или коллбэк - разницы практически никакой. Главное где-то записывать, что они используются, чтобы все в проекте знали.
>>1342614>если тебе нужно какую-то бизнес логику добавить в триггеры - тебе это не нужноВесело у вас в рубиманямирке. А посоны из постгреса-то и не в курсе что триггеры зря делали лоооол.
>>1342796Рельсам с их расширяемостью на уровне блога за 15 минут и перформансом на уровне пожилой улитки конечно не понять зачем в реляционных бд существуют триггеры. Остаётся только обоссывать собственный ротешник.
>>1342789Весело у тебя в джуномирке. Посоны из постгреса на то и из постгреса, что решают проблемы в постгресе. Различные подходы и решения не просто так стандартизированы. Ты можешь всё захуячить в триггерах, ты можешь 99% бизнес логики описать в хранимках (и есть одна компания, которая так сделала) - это будет нормально, если все знают, что делают и всех это устраивает. Но если часть делать так, часть делать эдак - рано или поздно все проебётся. Люди уходят, люди приходят, а нестандартные решения остаются и дорогие человекочасы тратятся на разбирательства.
>>1342833А кто сказал что триггеры предназначены для 99%/всей бизнес-логики.А кто сказал что хранимки и триггеры не должны попадать в миграции и схему бд.>джуномирке.Плиз.
>>1342844>А кто сказал что триггеры предназначены для 99%/всей бизнес-логики.Ты так говоришь, как будто бы это что-то плохое. Сказ наоборот о том, что все яйца нужно держать в одном лукошке, а не траспортировать в жопах курьеров по одному. Если у тебя часть бизнес логики в рельсах, часть в триггерах, чем в хранимках, часть в коллбэках, тебе будет очень трудно работать с этим кодом спустя годы. >А кто сказал что хранимки и триггеры не должны попадать в миграции и схему бдСтартапер дохуя? У тебя в рельсах никогда не было несколько сотен миграций? Тебе нравится пялиться в schema.rb? У тебя, наверное, и коллег нет, или все они с большой любовью делают то же самое? Техническая возмножность то, что ты хочешь делать есть, но это нихуя не удобно в большинстве случаев, и создает охуенно большое пространство для проблем.
>>1342850>Ты так говоришь, как будто бы это что-то плохоеНет, я так не говорю, это твоя фантазия.>Стартапер дохуя? У тебя в рельсах никогда не было несколько сотен миграций? Тебе нравится пялиться в schema.rb? У тебя, наверное, и коллег нет, или все они с большой любовью делают то же самое? No offence, bro, но ты выступаешь сейчас с позиции быдлокодера.В моём текущем проекте например CI не пропустит билд если закоммитишь файл с <80% покрытием тестами.>Техническая возмножность то, что ты хочешь делать есть, но это нихуя не удобно в большинстве случаев, и создает охуенно большое пространство для проблем.Откуда ты знаешь что я хочу? Я нигде не говорил чего хочу.В данном конкретном случае поместить пересчет счетчика в триггер/хранимку - вполне неплохая идея. Например, если приложение - месенджер с чат-комнатами, сообщения пишут часто, надо постоянно обновлять счетчик количества сообщений в комнате. Это действие вероятно станет ботлнеком при достижении определенного объема данных. Хранимка/триггер будет намного эффективней по перформансу. Не так удобна для поддержки, но у каждого решения свои плюсы и минусы, которые хорошо бы знать и уметь использовать когда нужно.
>>1342850>У тебя в рельсах никогда не было несколько сотен миграций?https://github.com/jalkoby/squasher
>>1342852>Откуда ты знаешь что я хочу? Я нигде не говорил чего хочу.>В данном конкретном случае поместить пересчет счетчика в триггер/хранимку - вполне неплохая идеяЭто не бизнес логика. Ты предлагаешь её хранить в триггерах и процедурках налево и направо. Я выше писал, что если ты так делаешь, могут возникнуть проблемы. Необходима хорошая документация. >Не так удобна для поддержки, но у каждого решения свои плюсы и минусы, которые хорошо бы знать и уметь использовать когда нужно.То есть ты высказываешь ту же самую мысль, что я описал ранее, но делаешь это специально настолько ублюдочно, чтобы развести срач. >>1342856>https://github.com/jalkoby/squasherИнтересно, но есть подозрение, что он не будет корректно работать с последовательностью миграций, которые апдейтят связанные между собой хранимки.
>>1342915>>1342925>>1342936>>1343030>>1343051>>1343087Возможно вам важно знать мое мнение. Так вот, я двачую вот этого >>1342892 анона. А второй тупо позер.
>>1342596>>1342598А где этот питушара? Мне самому интересно какие там ошибки лол. Вместо обсуждения программирования итт джуны кидаются какашками и переходят на личности, код покритиковать или предложить ни один мудак не может. Вафлы.
>>1344638Ты добавил поведение методу save, которое от него не ожидается. Он должен сохранять объект, а не устанавливать какие-либо значения для него. Пользователи твоего класса ожидают, что save будет работать как обычно.
>>1345012О боже, какой кошмар, бедные пользователи моего класса, я обманул их ожидания.Нужно срочно запретить оверрайдинг методов при наследовании чтобы не обманывать ожидания пользователей. Сообщите в комитет по ООП, они должны знать!!!!
>>1345086Чувак, ты какой-то странный, тебе вполне верное замечание сделали. Это важно, чтобы методы делали то, что описано в их сигнатуре. Это признак хорошего, понятного кода. Твой код пахнет так себе.
>>1345501То есть метод save не должен проводить валидацию, не должен обновлять timestamps, не должен вызывать before_ и after_ колбэки, обновлять changed_attributes, т.к. это всё не упомянуто в сигнатуре? Тогда рельсы пахнут еще в 1000 раз хуже.
Про валидацию вообще не понимаю как ты может засунуть не валидные данные?Я думаю что бы сделать save у модели даннвх данные нуэно проверить вне где то
>>1345613> но это Ar и от этого не уйдешьНу так че ты проблемы AR на мой код спихиваешь.>>1345616Т.е. ты даже не знаешь как валидации в рельсах работают, но чето кукарекаешь? Ясно.
Существует ли похожий язык, только нацеленный не на веб, а приложения? Хотелось бы начать с чего то программирование, но на С++ чет не хочется.
>>1346183Очевидный питон очевиден. Пример декстопного приложения на питоне: https://github.com/GNOME/meldНо он тоже интерпретируемый, и чего-то требуещего производительности не сделаешь.Менее похожий, но всё же что-то как-то - это Scala под JVM.Для мобильных приложений бери Dart/Flutter, лучше ничего нету.
>>1346183Но если тебе просто для вката в программирование, то на руби во время обучения пили консольные приложения, а там до рельсов рукой подать.Для построения нескучного UI в консольных приложениях есть гем https://piotrmurach.github.io/tty/
>>1324437 (OP)Господа, подскажите, пожалуйста, где можно найти полное описание синтаксиса Руби без ёбаных гайдов для новичков?А то не очень понятно как читать подобное: huipizda :ebat => kopat, pizdec {:nahui => hiv}
Вангую что вопрос у меня глупый, но никак не могу понять как сделать в рельсах следующее..Есть модель tour с полями tour_id и title + соответствующий контроллер со стандартными методами index, show и т.п.Есть контроллер stats со стандартными методами index, show и т.п.В routes.rb: resources :tours do resources :statistics endТ.о., валидны урл-ы типа /tours/1/statistics.Ппонимаю, что выглядит криво, но вопрос не в этом.На страницах по адресу типа /tours/1/statistics мне нужно вывести форму с выпадающим селектом этих tours по id, причем по нажатию submit с выбранным tour_id, скажем, 2, браузер должен переадресоваться на /tours/2/statistics. Пишу такую форму:<%= form_with model: @tour do |f| %><%= f.select(:tour_id, Tour.all.collect {|u| [u.title, u.id]}, :prompt => 'Select') %><%= f.submit("Submit") %><% end %>Ожидаемо переадресует на /tours/2. Не могу понять, что мне надо сделать для нужного мне результата. Или вообще перепилить statistics из отдельного контроллера в метод контроллера tour? Но и тогда не понимаю как сделать и, главное, где копать.
>>1348813А форму не хочешь через simple_form сделать? Селект особенно твой, очень страшно такое видеть.Если я правильно понял твой вопрос, то ты должен в контроллере в методе :update или :save или что у тебя там, вот ты должен в конце метода сделать redirect_to на стату, там разберешься.
>>1349075>А форму не хочешь через simple_form сделать?О, спасибо, совсем забыл про этот гем. Мало работал с этой темой.>Селект особенно твой, очень страшно такое видеть.Ну из официальных api доков взял, как-то так.>Если я правильно понял твой вопрос, то ты должен в контроллере в методе :update или :save или что у тебя там, вот ты должен в конце метода сделать redirect_to на стату, там разберешься. Ага, были такие мысли, попробую.
>>1348813>2k19>Рендерить html на сервереОсиль уже react или vue. Это не троллинг, если что, я за последние года 3, а то и больше, не могу вспомнить что бы мне хоть раз пришлось рельсами что-то кроме json или xml отдавать.
>>1349167Да, это в планах.Вопрос в том, по каким критериям стоит делать выбор. На данный момент vue, react, angular и тд, и тп для меня темный лес.
>>1348813Не понятно, что ты хочешь сделать и ты видимо сам толком не понимаешь, отсюда и проблема.Предположу что есть какая-то страница статы с быстрой goto-формой.Есть три способа:1. Делаем стату отдельным контроллером, а форма просто будет сабмитить id тура на StatsController#show.2. Делаем стату collection-action-методом, а форма просто будет сабмитить id тура на ToursController#stats.3. Делаем так как ты сказал, но обрабатываем сабмит js-ом, подставляя в window.location = '/tours/:id/stats'. И тащемта опять же тут не нужен отдельный контроллер, можно обойтись member-action-методом ToursController#stats.>>1349075Не слушай школьника. И никогда не используй говно-гемы для форм. Сейчас у тебя отличная форма.Только сделай f.select(:tour_id, Tour.limit(100).pluck(:title, :id), :prompt => 'Select')
>>1349212>Предположу что есть какая-то страница статы с быстрой goto-формой.Да, так и есть.Все получилось с добавлением редиректа в контроллер + добавил в форму method: :get и local: true.Вообще, понял что в любом случае вариант с js будет более гибким, т.ч. пойду изучать как правильно его связывать с рельсами. Всем спс.
>>1349420>Все получилось с добавлением редиректа в контроллерЛолЭто что-то на уровне подпилить ножки у стола, чтобы отрегулировать высоту стула.
>>1349167> react или vueНинужное говноедство на которое убивается немеряно времени, а профита против turbolinks + rjs - чуть более чем нихуя.Почитать на тему: https://medium.com/@jmanrubia/escaping-the-spa-rabbit-hole-with-turbolinks-903f942bf52c>>1349212>Только сделай f.select(:tour_id, Tour.limit(100).pluck(:title, :id), :prompt => 'Select')Вызов модели из вью - мы вам перезвоним.>>1349708Двачую.А делать надо было вот что. Для этой странички написать ЖС, в нём навесить обработчик onChange для селекта, который будет менять form action на "/tours/" + select.value +"/statistics". Всё.Если пойти чуть дальше, то этот же обработчик может заодно и сабмитить форму, тогда можно убрать нинужную кнопку. Да и форму можно убрать, и делать переход с помощью window.location. Самое простое = самое лучшее.
Алсо, каким надо быть уёбком, чтобы человеку, которому нужон однострочник на JS, советовать выучить react.
>>1349946>Нинужное говноедство на которое убивается немеряно времени, а профита против turbolinks + rjs - чуть более чем нихуя.Скажу честно, статью не читал, слишком длинная. Если ты тратишь с vue больше времени, чем с rjs, то ты что-то делаешь не так или у тебя просто еще недостаточно опыта работы с ним. Я разрабатывал всякие сложные формочки и прочие сильно интерактивные штуки еще во времена тотального доминирования jquery и помню как даже первый angular был просто божественным откровением. Наконец-то не надо было вешать десятки обработчиков всяких onclick и onchange и 100% обосраться в процессе в каком-нибудь селекторе, или забыть обновить доступные значения в селекте, или забыть скрыть часть полей, или еще миллион других вариантов оставить интерфейс в неправильном виде удачи все это сделать с помощью rjs, кстати. С ангуляром (а сейчас с react/vue) можно было просто менять стейт в js и он сам правильно отображался на интерфейс. Это реально был переход от императивного к декларативному программированию на фронтенде.>>1349991В данном случае это, конечно, оверкилл, но это учебный проект и в них оверкиллы это норма и даже необходимость. В будущем, когда ему понадобится сделать и правда что-то сложное на фронтенде, он уже будет знаком с подходящими для этого инструментами.
>>1349946>Вызов модели из вью - мы вам перезвоним.Сложно переть со своим мнением против догм, но это самое адекватное решение в 99% случаев.Конечно, вызов вызову рознь, если там сложные квери, то разумеется нельзя. Но в данном случае это ок. Если бы мне соискатель сказал, что тут нужно завернуть в декоратор, налепить view-model и прочей поеботы и настаивал бы на этом после уточняющих вопросов, то я бы такому "правильному" точно перезвонил.
>>1350130>>1349946Алос, раз уж заговорили про это. А скажи-ка как бы ты это оформил?Если ты все-таки скажешь про форм-обжект, то приведи конкретную реализацию для этого случая. Точнее публичные интерфейсы форм-обжекта.
>>1350130>Если бы мне соискатель сказал, что тут нужно завернуть в декоратор, налепить view-model и прочей поеботы и настаивал бы на этом после уточняющих вопросов, то я бы такому "правильному" точно перезвонил.Тебе достаточно определить переменную в экшене, пёс.
а зачем он нужон ваш руби? что на нём писать то и в какой сфере?чё-то в последнее время так наслуху он, но судя по всему предполгаю, что это очередной язык который "может всё", но при этом для неосиляторов.
>>1350212Руби нужон для написания блогов за 15 минут. Для остального он нинужен.Алсо, если у тебя руби на слуху, то ты слоупок лет на 10. Руби уже отходит в мир иной вместе с индустрией блогов за 15 минут.
>>1350217а понял это для веба какая-то хуета. ну и зачем так усиленно его дрочить? есть же универсалниые инструменты давноhtml/css/js/php/mysql/c#...
>>1350217алсо вас не послушаешь, так у вас всё свой век отживает. c++, php, джава что не спроси у анона всё отживает свой век. лол
>>1350004Нихуя себе оверкилл - выучить ещё один фреймворк вместо написать одну строчку. Оверкил лол.На изучение жс-фреймворка потратишь уйму времени, а через полгода он устареет нахуй и пользы от него останется только в /пр/ глупые советы давать.
>>1350854Не понос, а шоколадный смузи. Руби - самая годнота среди неборщехлебных языков. Трюли, индид.
>>1350837>выучить ещё один фреймворк вместо написать одну строчкуНу это не рельсы, у react и vue публичное API сотни раз меньше. На react можно начать писать вполне вменяем код через день, на vue через пару дней. При условие, что ты уже знаком с js, конечно.>а через полгода он устареет нахуйГода 3-4 назад я согласился бы. Но сейчас все устаканилось, рыночек уже года 3 как доминирует реакт и никуда уходить не собирается, плюс есть популярная альтернатива - vue и angular 1 еще часто встречается в легаси проектах. И вообще-то все, все остальное почти мертво.
>>1350879В эпоху хайпа рельс я вполне себе использовал руби, мой юный друг, но делал это исключительно ради денег, а не из-за каких-то его мнимых преимуществ.
>рыночек уже года 3 как доминирует реакт и никуда уходить не собирается, плюс есть популярная альтернатива - vue и angular 1 еще часто встречается в легаси проектахВ том и дело что популярная альтернатива появилась недавно, и так же может уйти. Появится что-то еще, и не будет спрашивать твоего мнения - уходить реакту или нет. Ангуляр третий выпустят, и будешь его с нуля учить, как учил второй после первого. Короче, у фронтендщиков уже который год каждая ночь трудная, а очко разработано так, что они без труда могут спрятать в нем десяток фреймворков.
>>1350904>Ангуляр третий выпустятЛол, уже бета 8-й версии вышла. Так что ад гораздо страшнее и глубже
>>1350904>Ангуляр третий выпустятУже седьмой выпустили, всем на него похуй после обосрамса с переходом с первого на второй.Я так-то согласен, что технологии на фронте менялись слишком быстро. Но коммьюнити это тоже осознало и сейчас темп стал намного более разменянным. Как пример не только react, но webpack по-сути тоже стал дефолтом на фронте уже несколько лет как и никуда уходить не собирается, всякие react-router, redux и прочие перестали мажорные версии выпускать.
>>1350906>GILМожно асинхронные вызовы и в одном потоке гонять>НикакНу это же пиздец, как у вас хайлоад писать
>>1350906И питоне тоже GIL, ты путаешь aсинхронность и параллелизм. Для асинхроности в руби есть вполне годная EventMachine.
>>1350912Хайлоад блог за 15 минут лол кек. Как только проект на руби достигает уровня "хайлоад", его переписывают на Скалу или еще что-то другое. Таких случаев в истории единицы, их все знают наперечёт, во всех остальных случаях слово "хайлоад" используется чтобы нахмурить брови на собеседовании (обеими сторонами), и реальным хайлодом там и близко не пахло. Так что, Иван Федорович, слушайте "валенки" и не выёбывайтесь.
>>1350940Связан с беттингом, легкая интеграция и кастомизация собственной платформы для всех желающих
>>1350947Руби для беттинга называется Эликсир.https://jobs.dou.ua/companies/betinvest/vacancies/55115/
>>1341444>Ну давай рассказывай как ты каждый день борешься с present? у Object и second у Array. Я тоже, конечно, против money patching, но именно фреймворку по-моему позволительно добавить некоторые методы общего назначения в стандартную библиотеку. И как уже сказали выше некоторые из них кочуют в руби.Действительно, зачем делать валидации, приведение типов, если можно во все объекты, даже небо, даже Аллаха, захуячить blank?/present? и вызывать в любом месте проекте, да, быдлокодерок?
>>1351344Действительно, зачем делать валидации и приведение типов, еслли можно во все обхекты захуячить blank?/present? ?
>>1351512Ты задал этот вопрос, решив подъебать собеседника, а я задал, потому что действительно хочу знать ответ. Объясни джуну, пожалуйста.
>>1351569Потому что валидация и приведение данных должны быть в одном определенном месте в архитектуре приложения. Когда введёные данные прошли этот фильтр, их можно считать корректными, безопасными и оперировать ими в коде бизнес-логики.Манки-патчинг всех в мире объектов - это фактически добавление глобальных функций. В Руби есть глобальная функция puts для вывода, но мы же строим архитектуру MVC с выводом только из View слоя. Если провести аналогию, быдлокодеры говорят - зачем нам париться с View, давайте в каждую модель хуйнём метод puts, ведь это так удобно - выводить данные модели из самой модели.
>>1351827По твоей логике у Object вообще методов быть не должно. Плюс никто не мешает present? использовать только внутри валидаторов, хотя, как по мне, он и внутри бизнес логики иногда полезен. Интересно, кстати, что ты скажешь, если завтра present? добавят в стандартную библиотеку, как уже случалось с другими методами из рельс?И puts, кстати не глобальный метод, а метод из модуля Kernel, который замиксинен только в Object, но не в BasicObject.
>>1351985Никто и на похапэ не мешает писать хороший код, только почему-то на руби код в среднем по больнице лучше. Скажу что это плохой шаг. Пока что Мац сопротивляется уже на протяжении лет так трёх. Сейчас говорю что Мац молодец, пусть вашего брата быдлокодера и дальше на хую вертит.
>>1351827Я согласен по поводу валидации и обработки параметров. Но как это пересекается с present? ? Ты пишешь так, как будто бы наличие этого метода подразумевает отказ от валидаций. Сам по себе этот метод очень удобный, ничего плохого в нем нет. Проблема только в том, что это манки патчинг. Он хуевый по дефолту. Даже если в каком-то конкретном примере он приемлем, он все равно хуевый, потому что с маленького шашка начинается большая героиновая зависимость. Но ты пиздишь на present? так, как будто бы не понимаешь, в чем проблема. Тебе главное пиздеть, брюзжать, брызжать слюной.
>>1352074Откуда тебе знать что для меня главное, лол. Я даю аргументецию, а ты на личности переходишь. Неудивительно что такому быдлу нужен глобальный манки-патчинг лоол.
>>1352102Тем временем ниодного конкретного примера чем же present? так плохо, кроме кококо-манкипатчинг так и не было.
>>1352116>>1351827inb4 только ты решаешь что такое хорошо, поэтому мои примеры не примеры, поэтому ты снова перейдешь на личности вместо аргументации
>>1352102Твои аргументы инвалидны. Ты ничего не говоришь конкретно о present?, ты подменяешь понятия и предполагаешь, что адепты present? в остальном тоже говнокодеры.
>>1352128Тут несколько человек с тобой разговаривают. Я хочу разобраться. Объясни. Ты не объясняешь нихуя. Я настроен на конструктивный диалог.
>>1352138Джуну который задавал вопрос я достаточно подробно ответил. Если тебе после этого что-то непонятно, то тебе потребуется поставить вопрос чтобы получить на него ответ. "Объясни. Ты не объясняешь нихуя." - как ты живешь с такими коммуникационными навыками.
>>1352142Я не он, но мне тоже интересно, чем плох present? и я, например, не понял как связаны объекты для валидации входящих данных и этот метод. То есть я понимаю, конечно, что его можно использовать как замену очень простой валидации и это, наверное, не очень хорошо, но ведь это не единственный юзкейс, да и внутри самих валидаторов скажем почему бы его не использовать.Пример, есть очень ебанутое API, которое для одного из ключей в json объекте может возвращать null, пустую строку или массив - пустой или со строками. У меня есть класс, который приводит всю эту хуйню к нормально виду и в нем есть примерно вот такая строка: object[:foo] = [] unless object[:foo].present?Что в ней плохого, если представить, что я до этого уже провалидировал, что от API пришел один из 3 вариантов выше?
>>1352248Я написал чем плох манки-патчинг всех в мире объектов и почему это не надо делать на уровне языка. Ты спрашиваешь чем плох вызов метода в конкретном месте конкретного проекта.
>>1352293Нет ты противопоставлял валидации и прочие штуки методу present? >Действительно, зачем делать валидации, приведение типов, если можно во все объекты, даже небо, даже Аллаха, захуячить blank?/present?Но нигде не пояснил как одно мешает другому?И так и не пояснил, чем плох конкретно этот манкипатчинг. А когда тебя спросили, что если добавить этот метод в стандартную библиотеку, ты просто сказал, что это плохо без аргументов.>Скажу что это плохой шаг. Пока что Мац сопротивляется уже на протяжении лет так трёх. Сейчас говорю что Мац молодец, пусть вашего брата быдлокодера и дальше на хую вертит.
Какой подход лучше когда во вью нужна короткая, но всё же логика для отображения: во вью её и вписать, использовать хелпер, использовать презентер?
Помогите не погромисту, и даже не эникею. Есть код https://pastebin.com/mU0QZ22B Нужно объяснить мне, как сделать, чтобы он работал. Установил интерпретатор, запустил файлик - не работает. Вылезает командная строка(?), исчезает - и ничего. За долю секунду разобрать, что было написано, не получается. Имеем винду и мозиллу версии 52.4.
30/час если на пол ставки. первый месяц 20/час, так-как давно не работал. не более 4 часов в день.50/час если на полную ставку, удаленно.70/час на полную и в офисе, время на дорогу за их счет.норм просить? не хочу на полную.35 лвл. много или пофиг? куда не стоит лезть?
>>1356424Ищи любителя цопе, который тебе это заведёт. Сам ты на винде это не запустишь.>>1356433Если в евро, то норм. В долларах я бы подумал дважды, но в принципе можно.
>>1356440>Сам ты на винде это не запустишь.Ок. Теперь есть определенность, что этот код не нужон. А разве там не недостающую библиотеку скачать, чтобы заработало, не?>>1356440>Ищи любителя цопе, который тебе это заведёт.Што?
>>1356443Ну скачай если сможешь. Там библиотек несколько и что из них заработает под виндой - вопрос. А заниматься этим вопросом никому не интересно, т.к. винда и руби мало совместимы.>Што?А это скрипт для чего, как ты думаешь?
>>1356446>Там библиотек несколько и что из них заработает под виндой - вопрос.А разве по типу ошибки неясно, какую именно, нужно наугад библиотеки перебирать и тестить? Не подскажешь, где качать эти библиотеки? Или все равно работать не будет?>А это скрипт для чего, как ты думаешь?Взрослые одетые тины - ну такое себе цопе.>>1356448Я не хакир. И ради одного скрипта учиться пользоваться линуксом - это фантастика.
>>1356450Библиотеки>require 'excon'>require 'fileutils'>require 'nokogiri'>require 'open-uri'>require 'rmagick'>require 'ruby-progressbar'Как это в винде устанавливать не представляю.
С rmagick могут быть трудности, с остальным должно быть проще. https://www.google.com.ua/search?q=install+ruby+gems+on+windows
>>1356480Но это ж оверкилл когда для пары методов новый класс создавать когда можно хелпер заюзать, не?
>>1356488Практически всегда наступает такой момент, когда логика расширяется, и какой-то умник продолжает её пихать в хелперы. Лучше сразу делать нормально. Это как урна мимо которой всегда бросают.
Подскажите идею для пет проекта.Что бы на уровень мидл тянуло. Кроме магаза в голову ни чего не приходит
>>1358556Мань не делай хуйню. Придумай что-то интереснее и сложнее, сделай систему краша вк-групп с циклическим добавлением друг дружки ботов. Это понял 100-200 аккаунтов, и они по кругу бы постоянно добавляли друг друга в групповой чат ВКонтакте и удалялись оттуда, создавая с этим бешеный флуд, и невозможность их кикнуть/забанить, ну только если через API как-то и всех сразу, но они бы инвайтили обратно того кого кикнул овнер.Так-бы
>>1358825так бы... закрашить можно было кучу конференций ВКонтакте и было бы весело, я бы проспонсировал 200+ ВК акков хули поржать можно
>>1324437 (OP)>Ну короче все языки были хуйней я хотел запилить че-нить для человека, простое, гибкое...>гуглишь туторы про работку я массивами>так короче 100500 ненужных прикрученных способов есть>где тут индексация так такс>ну короче ВАМ ИНДЕКСАЦИЯ НЕЧАСТО БУДЕТ НУЖНА поэтому ее тут и нет ХАХАХАХХАХА>..>втф??Объясните, рубисты. Сам хотел подергать необычные языки, чтобы быть более грамотным, открыть что-то новое...
>>1360321Что тебе не понятно? Как работать с массивами? Оперировать значениями? ПС я знаю уже пару способов и все они мне не нравятся
>>1360325>ПС я знаю уже пару способов и все они мне не нравятсяНапример? >ну короче ВАМ ИНДЕКСАЦИЯ НЕЧАСТО БУДЕТ НУЖНА поэтому ее тут и нет ХАХАХАХХАХАИндексы есть
>>1360335>индекасы естьПокеж. массив[х]=2 или массив[да]=нет или массив[длина/2]=массив[длина], ну и добавить(добавляемое, массив), до кучи.>напримерНапример через step, только я не знаю новомодный ли он, или старый.
>>1360342>массив[х]=2так есть же array[0] = "value">массив[да]=нетКАВО?>массив[длина/2]=массив[длина]НЕПОНЕЛ>добавить(добавляемое, массив)array.push(value)
>>1360342>массив[да]=нетПХПшник что ли?Я, кстати, тоже с трудом понял, что ты понаписал.мимодругойрубист
>>1360360В руби массив это традиционный массив и у него могут быть только цифровые индексы. Если тебе нужен ассоциативный массив, то он называется Hash.>А как удалить элемент из массива из любого индекса?https://devdocs.io/ruby~2.5/arrayhttps://devdocs.io/ruby~2.5/enumerableПросвещайся.
>>1360361>>1360362Сяяяп, ладно, пойду почекаю. Вероятно, я в прошлое наше с руби знакомство затупил и у меня просто глаза разбежались от странностей. Как вам сам язык-то? Че-нить прикольное(серьезное) с ним делаете? >>1360364>я делаль язык прежде всего для людей>и што што тормозит, для людей ЖЕ>пока компилируется можете сходить поссать, или кофе там выпить, круто же! для людей11!!
>>1360358>Помню начал чекать руби, но ненавижу динамикодрисню>Помню начал чекать еблю в жопу, но ненавижу пидоров>Как вы можете на ней так писать? Да, нормально. В большистве статически типизированных язык все типы по-дефолту nullable, что по-сути тоже их делает довольно динамически типизированными и ничего пишут же люди.
>>1360366> >>1360367Улучшаете и улучшаете свою ебаную скорость, пока другие языки просто созданы чтобы выигрывать.
>>1360366>Че-нить прикольное(серьезное) с ним делаете?Ничего особенного. Пишу в меру хуйлоадный проект, плюс на беке куча ебанутой бизнес логики покрытой десятками тысяч тестов. Вообще подход очень неторопливый и интерпрайзный ко всему, я даже удивлен почему когда-то давно взяли руби, а не какую-нибудь джаву.
>>1360370Ну рассказывай для чего тебе скорости руби не хватает. А то видел я таких, у них запрос к базе по полминуты делается, а виноват руби.
Помогите ньюфагу. Почему если я размещаю метод edit (редактирование статьи в моём случае) ниже create (создание статьи), то браузер пишет, что значение переменной равно нулю? А если выше, то всё нормально.
https://github.com/ruby-association/prep-test/blob/master/silver.mdhttps://github.com/ruby-association/prep-test/blob/master/gold.mdБратишки, я вам тестов прямо от Матца покушать принес. Голдовый на удивление достаточно хардкорный.
Есть ли тут аноны, которые делали что-нибудь с е-коммерсом?Если коротко, то поясните разницу между: Cart (aka Basket) vs Order vs Invoice vs Payment [vs Checkout]. инбифо, я конечно же понимаю, что это значит, но с точки зрения сущностей мне не понятно, что нужно, а что нетЯ короче не знаю, как правильно смоделировать покупки.Во-первых, корзина. С одной стороны самостоятельная штука, а с другой это один-в-один таблица заказов. Но при этом корзины могут все-таки забросить и негоже им лежать вместе с заказами. Хотя какая хуй разница.Во-вторых, что за сущность такая инвойс. Я ее ни в юридическом смысле не понимаю, ни в техническом. Судя по всем это выражение факта оплаты, несмотря на то что инвойсы вроде как выставляют НА оплату.Чекаут это видимо тоже суть есть оплата.Посмотрел немного как сделано в Spree. Там походу только две сущности - Order (он же корзина в статусе "cart") и Payment.Короче, кто работал с этой предметной областью, подскажите, какие сущности нужно выделять. И как все-таки быть с корзиной.---Еще вопрос по поводу Spree. Насколько это серьезный движок, в плане архитектуры, масштабируемости и оптимизированности? Стоит ли подглядывать их практики и решения или даже использовать его или это сорт оф Redmine - хорошая, но тяжелая коробка, в которую лучше не лезть.
Поясните за колбеки у моделей в Rails. Почему в интернетах пишут что это говно? По-моему очень удобно если например среди полей, которые ты апдейтишь в модели есть определенное поле с определенным значением (status=published например), то можно в колбеке это обработать и сделать какие-то сопутствующие действия, например записать каррент юзера в поле publisher_id.
>>1364513Cart и Order разделяй. В корзине у тебя только товары. В заказе еще и данные покупателя/доставки/оплаты/аллаха.Не забудь, что товары в корзине - это отдельная сущность (i.e. Line Item), т.к. если в ассортименте на сайте, например, поменяются цены, то в корзине/заказе все должно оставаться так же, как и на момент доавления в корзину/оформления заказа.Все остальной из другой оперы и тебе особенно не надо.По Spree смотрел довольно давно, вроде хорошо задокументированно все, но я предпочитаю самопис, т.к. у текущего проекта по ИМ очень специфичная бизнес-логика.Пользуясь случаем спрошу у местных - готовим перекат на самопис на рельсах с Opencart. Как по уму настроить 301 переадресацию со старых опенкартовских урлов вида "<domain.ru>/index.php?route=product/search&search=123" на, к примеру, "<domain.ru>/products?search=123" штатными средствами? В routes.rb? Что покурить по этому поводу? Ссылочная масса в поисковиках довольно солидная, не хотелось бы терять.
>>1364693Можно и в routes.rb, но я бы на уровне nginx (или что вы там используете) сделал, будет быстрее работать и не придется захламлять настоящие роуты этим легаси. Если редиректить с http кодом 302, то все приличные поисковики, типа гугла, должны быстро подхватить изменения и начать выдавать новые урлы в результатах поиска.
>>1364605Если у тебя небольшое приложение с парой колбеков на модель, то ничего страшного в них нету. Проблемы начинаются, когда у тебя в моделях по 10+ колбеков, становится важен порядок вызова этих колбеков, эти колбеки начинают сохранять другие модели, что в свою очередь вызывает колбеки из этих моделей и это все растет как снежный ком. Один раз работал над приложением в котором сохранение поста вызывало 100+ колбеков в сумме. Ах да, еще скорость прохождения тестов тоже очень от этого страдает.
>>1364800Поэтому многие визжат, когда видят один единственный колбек в модели. Говно начинается с маленькой ватрушки, поэтому то, что может стать дерьмом, стараются не использовать даже в том контексте, в котором оно еще не дерьмо.
>>1364693>Cart и Order разделяй.>В заказе еще и данные покупателя/доставки/оплаты/аллаха.Это единственное основание для разделения? Потому что всего перечисленного в заказе быть и близко не должно, это отдельные сущности.>но я предпочитаю самопис, т.к. у текущего проекта по ИМ очень специфичная бизнес-логикаНу я посмотрел немного что там есть. И есть там походу очень не мало. И что важнее - это выработанные практикой решения, обобщенные, со стройным понятийным аппаратом. Так что если бы у меня был новый проект, я бы потратил время, чтобы разобраться и вероятно использовать его.А самописы страдают тем, что реализуют виденье "художника".
>>1365029>Это единственное основание для разделения? Потому что всего перечисленного в заказе быть и близко не должно, это отдельные сущности.Не единственное. Пользователь набрал товаров в корзину и закрыл вкладку. Зашел на следующий день, решив дооформить заказ. Сессия еще жива, должна быть жива и корзина. Это еще пример на вскидку.>И что важнее - это выработанные практикой решения, обобщенные, со стройным понятийным аппаратом.Половина из которых - специфика обработки заказов в штатах, т.е. те же инвойсы, итд. Впрочем, ничего против не имею. Бери комбайн и старайся кастрироваться его под своинужды. Глядишь и получится.
>>1365092>Половина из которых - специфика обработки заказов в штатах, т.е. те же инвойсы, итдА вот нет их там внезапно. Что подтверждает мою догадку о том, что инвойсы это какая-то квази-хуйня. Да и вообще ничего специфичного я там не нашел. Только вот оплаты заточены сугобо под карточки (как собственно и эктив-мерчант), как-будто других способов не существует. Но в это я не очень верю, видимо, бегло смотрел.
>>1365092>Сессия еще жива, должна быть жива и корзина. Это еще пример на вскидку.Не понял, и чего, как это относится к разделению сущностей?
В общем надо загрузить много файлов, заатачить к модели, и распарсить содержимое оттуда и создать еще кучу экземляров другой модели. Мне вот непонятно это лучше в ActiveJob дать или реализовать в виде сервисов? Я так понял если сделаю сервисы, то пока файля парситься будут клиент ждать будет, так?
>>1365288Тебе, блятб, дыважды расписали что и как и где могут быть подводные. Если совсем тупенький - то столкнешься с траблами. Изволил хамить - иди на хуй. Все просто.
>>1365744>Да пошел он нахуй, говнюк этот.Элик это будущее. Мне он так зашел, что я активно его продвигаю в моем круге и челикам он тоже заходит. Пока у меня только пару пет проджектов, если через месяц уговорим заказчика работать с эликом - то и на проде появится. Как раз новый проект начнем.
>>1366056Полумертвое говно без задач. Я пару лет назад в эликсир тред когда он еще не умер подробно расписывал почему эликсир параша, но сейчас мне лень искать эту пасту. Если тебе не хватает производительности руби (а других причин выбрать эликсир вместо руби почти нету), то просто бери котлин/скалу или ГОвно, в крайнем случае, они хоть живы.
>>1366077>Полумертвое говно без задач.Чего? По всему миру есть активные конференции и жобы.>то просто бери котлин/скалу или ГОвно, в крайнем случае, они хоть живы.котлин только в ведре, скала параша, говно создано чтобы завести аутентификацию на сервер и все. Нет никаких нормальных утилит, чтобы решать задачи. А феникс спокойно их решает, рельсы же забрызганное говно, к тому же еще и медленное.
>>1366095>Чего? По всему миру есть активные конференции и жобы.В несколько раз меньше, чем даже на руби. И за последний год похоже падает. Если посмотреть developer survey от SO, то в 2017 эликсир был и в most loved, и в most wanted, в most popular (хоть и не очень высоко), в 2018 его уже нигде нету. Пунктов в рейтингах за оба года одинаковое количество.>Нет никаких нормальных утилит, чтобы решать задачиВ JVM-мирке у тебя нету никаких утилит? Ну это вообще пушка. Что у тебя там за такие охуительные задачи, которые только эликсир может решить? Только не пиши про 100к коннектов на один сервер.>к тому же еще и медленное.Достаточно быстрое для 99% задач.
>>1366099>В JVM-мирке у тебя нету никаких утилит? жвм мирок я использую не в беке.>Что у тебя там за такие охуительные задачи, которые только эликсир может решить? меньше кода пишу>Достаточно быстрое для 99% задач.руби отсасывает даже от жвм. И не говори что это не правда.
>>1324437 (OP)Сап, рубиновые, хочу попробовать стать таким же модным как вы, но не хочу читать книжки для совсем начинающихЕсть опыт спринга и жабки, скажите мб кто нить перекатывался с них в руби, как перекатиться проще всего?
>>1367147Прочитай Eloquent Ruby (первые главы можно просто пролистывать, смотря только примеры кода), потом RoR Guides от корки до корки (главы про assets pipeline и js в рельсах можно скипнуть). Все, пили пет-проекты, там уж походу разберешься.Можно еще код какого-нибудь mastodon посмотреть, у них многовато кода в модели напихано, но в целом все довольно прилично.>>1367237Уебывай в свой мертвый тред, эликсиродебил.
>>1367269Нет. Я как вкатился на руби так и пишу на нем. Но в последние пару лет добавилось в стек много ноды и не очень много котлина (на беке, к счастью, а не на мобилках).
>>1367878Руби даже название для своей системы сборки самостоятельно придумать не может и тырит его (как и все остальное) у коммон лиспа (и тырит наверняка криво, как и все остальное). Нахуй так жить?
>>1368092asdf это универсальный менеджер версии с плагинами для кучи языков, написан он на баше и никакого отношения к руби он не имеет. Да и как там что-то называлось в мертволиспе никого не волнует, ты бы еще из-за пересечения названий с какой-нибудь либой на фортране возмущался, дедуль.
>>1368129> Да и как там что-то называлось в мертволиспе никого не волнует, ты бы еще из-за пересечения названий с какой-нибудь либой на фортране возмущался, дедуль.Пикрелейтед ссыт тебе в ротешник.
>>1368129>ы бы еще из-за пересечения названий с какой-нибудь либой на фортране возмущалсяasdf появился в 2013 году. Не шаришь - лучше промолчи.>asdf это универсальный менеджер версии с плагинами для кучи языковДа, правда никто им не пользуется, кроме трех с половиной рубистов-инвалидов.Вообще, говнина вместо нормального пекедж менеджера - это отличный аргумент против рубипитонодрисни. С жс еще ладно, там просто альтернатив нет и приходится страдать, но в 2k!9 самостоятельно себя обрекать на еблю с зависимостями, когда эта проблема уже давно решена во всех нормальных языках - это просто верх борщехлебства.
>>1368479>Не шаришь - лучше промолчи>Вообще, говнина вместо нормального пекедж менеджера - это отличный аргумент против рубипитонодрисниТебе самому тогда стоит помолчать. Это не пекедж менеджер. Это менеджер версий рантаймов, то есть он позволяет устанавливать кучу разных версий руби/питона/ноды/рандомнойхуиты. С появлением докера надобности в подобном стало, конечно, по-меньше, но все-равно иногда полезная штука.Для пекедж менеджмента у руби есть божественный bundler, который наголову выше и npm и pipenv.Ах да и коммон лисповский asdf появился в 2001.
>>1368531>Это не пекедж менеджер. Это менеджер версий рантаймовОх, так я тебе и говорю о том, что в нормальных языках версией языка в текущем проекте заведует пекедж менеджер (а для системных зависимостей тут конечно докер). >который наголову выше и npm и pipenvНаголову выше мочи и говна, ну ок.>Ах да и коммон лисповский asdf появился в 2001.Ну тогда это действительно что-то уровня фортрана, извени, я был неправ, это все меняет.
>>1366077Сильное заявлениеМожно конкретный пример?Просто не такой распиаренный как го, в остальном прекрасный инструмент под свои нужды, отличная эволюция эрлангаНу и фп не для всех
>>1369814Увы, давно прошло время когда языки без компаний взлетали. Судя по ред монкс элик растет, но его можно щупать лет через 5-10 когда действительно проекты появятся. Руби тоже помирает. А котлин будет жить, потому что жид брейнс вливает колоссальное бабло туда. А в элик кто вливает? Никто.мимо.
Только начал изучать руби. Есть задача: в метод передается String, в котором есть переходы на новую строку. Мне нужно найти строку, в которой, например, есть слово "foo".Не знаю как разделить String.И еще если мне не известно число переходов на новую строку, то надо будет обрезанные строки складывать в массив?
>>1371669https://ruby-doc.org/core-2.2.0/String.html#method-i-splitfoo надо искать регулярным выражением бзв
>>1371677Да-да, уже сам дочитал до сплита. Аригато.foo ищу через include?Я так понимаю можно же ловить тру типа:if strs[x].include?('foo') == true do something
>>1371712Решил уже эту задачу и застрял на следующей.Есть логи формата ip - - [date time] "POST address HTTP/1.1" randomintНадо переформатировать ее в вид date time FROM ip TO addressПочитал про match, про regexp, попробовал написать свой, берущий date time, т.к. показалось это самым простым, но походу я вообще не одупляю как они пишутся, потому как постоянно ловлю nil.
>>1371786Спасибо, на самом деле классная вещь.>>1371725Вроде написал метод, теперь осталось пасснуть проверку рубокопа на дефолтном конфиге, потому как он выдает ABCSize [22.69/15]Код: https://pastebin.com/GdPXZqHG
>>1373328Разжёванной до какого уровня? Документация и книжки такого уровня как у руби и рельс ещё поискать над.
Пожалуйста посоветуйте, как сделать нормальную авторизацию на Rails + React. Я уже задолбался с девайсом, такая хрень.
>>1373412Можешь попробовать https://auth0.com/Или сам пили JWT авторизациюie. https://medium.com/binar-academy/rails-api-jwt-authentication-a04503ea3248
>>1373838Бразильцы знатно переусложнили, понимаю. С другой стороны гайдов по Devise оч много.https://github.com/plataformatec/devise/wikihttps://habr.com/ru/post/208056/https://www.sitepoint.com/devise-authentication-in-depth/https://medium.freecodecamp.org/lets-create-an-intermediate-level-ruby-on-rails-application-d7c6e997c63fПопробуй спуститься на уровень ниже и разобраться как работает Warden.Если не хочешь девайс попробуй сам сделать с has_secure_password: https://gist.github.com/iscott/4618dc0c85acb3daa5c26641d8be8d0d
>>1374796Ну например в Django гораздо легче отстрелить себе ногу и понаписать говнокода на мой взгляд. Я бы не стал давать его в руки нубов.Вообще это всё вкусовщина.
>>1375034Что значит какие? А какие тебе нужны?БОльшая часть гемов работает на всех платформа, но скорее всего понадобится напильник.Впрочем я бы не советовал чистую винду. Используй докер или WSL.
>>1375051Если ты про докер, то вообще без разницы. Ты не будешь его видеть;Если про настоящую виртуалку, то Ubuntu или Mint норм.Если тебе не нужен интерфейс, то Debian.
>>1375062Не совсем понимаю вопрос. Думаю ответ — да.Пример из документации$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.5 ruby your-daemon-or-script.rb
>>1375062Попробуй лучше https://docs.microsoft.com/en-us/windows/wsl/install-win10Будет сильно проще чем с докером.
>>1375020Питон вообще куда более расположен к написанию говнокода, это я как питонист заявляю. Больше фич в языке - больше мест где можно обосраться. >>1374796Джаго уже в этом, 2019 году станет асинхронной.
>>1376056Чтобы хранить глобальное состояние класса и всех его потомков. Например там может быть какой-нибудь кэш который требуется всей иерархии классов.В чистом виде редко используется потому что, как и любое глобальное состояние, требует дисциплины. В Rails есть хелпер class_attribute который делает примерно тоже самое, но не имеет побочек (дочерний класс не может поменять состояние родительского).
>>1376059Блоки это такой синтаксис для передачи анонимного колбека как параметра внутрь другого метода.В JS:[1,2,3].map(function(i) { i 2 })В Ruby:[1,2,3].map { i 2 }не совсем, но такое объяснение сойдёт
>>1376070Функция может принимать другую функцию как аргумент. Это аргумент обычно именуется колбеком.про анонимность не важно
>>1376082В PHP ты можешь определить такую функцию:function modify_array($arr, $callback) { $result = []; for ($i = 0; $i < count($arr); $i++) { $result[$i] = $callback($arr[$i]); } return $result;}Она принимает 2 аргумента: какой-то произвольный массив ($arr) и какой-то произвольную функцию-обработчик ($callback).Дальше она создаёт пустой массив $result; затем начинает обходить $arr и каждый элемент исходного массива $arr[$i] передаётв функцию-обработчик $callback($arr[$i]). Результат работы обработчика записывается в $result[$i].В конце работы функции получается, что ты прменил какое преобразование к каждому элементу исходного массива.Вот как можно использовать:$my_callback = function($i) { return $i + 1;}modify_array([1, 2, 3], $my_callback);Вернёт: [2, 3, 4]
>>1376101Я думаю тебе пока рано браться за тему с функциями высшего порядка.Думай о блоках как о дополнительном синтаксисе для не которых функций.
>>1376124где можно в сети задать вопрос и получить ответ?только не стековерфлоу-там тупые вопросы морозят
>>1376138Никогда не задумывался об этом.Здесь можно; я знаю есть телеграмм каналы; есть reddit; есть freecodecamp
>>1376142формат двача мне нравиться,но в этом треде как в склепе.телеграмм заблокирован,а что на реддите?
>>1376155Если у тебя вопросы по основам, то тебе не важно какой язык.Если у тебя вопросы конкретно по Ruby, то эта книжка ответит на бОльшую часть: https://rucont.ru/file.ashx?guid=a25197f9-332a-40e6-a102-c8a4cad0124b
>>1376160у меня есть книги по руби,могу немного в англ шоб читать статьи в инете,но бывает что авторы очень херово объясняют
>>1376168Хорошо! Ты проходил какие-нибудь гайды по рельсам уже? Знаменитый How to build a blog in 15 minutes with Rails?
>>1376175Тогда придумай себе какую-нибудь цель, типа написать на Ruby калькулятор. Изучать язык в отрыве от производства бессмысленно.
>>1376659По виду он не достаточно opinionated и не достаточно форсит правильную архитектуру. В итоге если дать Django новичку, то он превратит всё в цирк c конями и PHP. Я могу ошибаться т.к. никогда не работал плотно с Django, но мой опыт кричит об этом.Та самая пресловутая "магия" в рельсах отстрелит тебе голову, если ты попытаешься отстрелить себе ногу и отойти от общепринятых норм. Как ни странно в случае с новичками это сильно помогает.
>>1376871Это показатель на сколько развита всякая автоматизация типичных задач в рельсах. Это не показатель насколько релсы хороши и какие возможности они имеют. Просто одна из фич: смотрите я могу сделать простейший CRUD прямо из командной строки.
>>1376874Нет, не пиздец. Но тебе будет не комфортно, если ты начнёшь класть код не туда куда положено или делать всякие глупости.Рельсы пассивно-агресивны и с ними нужно сотрудничать иначе они будут тебя саботировать. Это не значит что ты чего-то не можешь сделать (или что ты там удумал?) или как-то ограничен.https://dhh.dk/2012/rails-is-omakase.htmlК чему вообще все эти вопросы? Просто попробуй и посмотри понравится или нет.
>>1376888Мелкие улучшения качества жизни + Action Mailbox и Action Texthttps://edgeguides.rubyonrails.org/6_0_release_notes.html
Ай нид хелп (я тупой).Есть проект на актуальных рельсах с актуальным devise.Как правильно запретить автологин пользователя после успешной регистрации? Гуглил, читал, оверрайдил родный девайсовские контроллеры и так и эдак, вносил соотв. изменения в routes.rb, нихрена не работает.Кто-нибудь делал такое?
>>1376934На вскидку:ты можешь переопределить этот метод https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb#L105
>>1376936О, встречал на стэковерфлоу такой момент. там переопределяли как:def sign_up(resource_name, resource) sign_up(resource_name, resource) endПоказалось чем-то слегка фантасмогоричным, но попробую.
>>1376945Не ну до этого додуматься я в состоянии, уже свою логику нужную вставил и нотис об удачном сайнапе убрал. Благодарствую.
>>1376945И в догонку, если не сложно: я редирекчу пользователя после регистрацию на условную pages/success с информацией о дальнейших действиях. Естественно, эта страница по прямому урлу доступна всем и кждому. А как мне сделать ее достпной только человеку, прошедшему регистрацию, при условии того, что я не логиню его автоматически?Понимаю, что проще тупо скинуть подтверждение на почту, но хотелось бы и немедленный визуальный фидбек предоставить.
>>1376966А, не-не, я действительно тупой.И тема с оверрайдамини к чему. Пусть себе логинятся, надо тупо редиректить на страницу с настройками акка, где и прописать все, что нужно, заодно дать возможность разлогиниться.Ну чтож, опыт - сын ошибок трудных и не всегда вменяемого тз.
>>1376936Вообще, действительно спасибо. Меня не хватило на самое простое, что могло быть - просмотр исходников. Посыпаю голову пеплом.
Сап. Подскажите какой итератор может сравнить в блоке элемент со следующим элементом?Вот я знаю только each_with_index, а следующий элемент потом в блоке arr[index+1], проблема в том что в конце массива возвращает nil, из-за чего надо проверять unless arr[index+1].nil?Но может есть получше вариант?
Создаётся впечатление что в руби больше вакансий и меньше конкуренция. Может хоть туда меня возьмут? Стоит изучать?
Что это такое на пикрил <<- ?Смотрю скрипт установки зависимостей для пакета через homebrew, если это важно
>>1377715Это heredoc. Мне кажется, даже в Си можно было такое делать.https://www.rubyguides.com/2018/11/ruby-heredoc/
>>1377742Спасибо, а где можно почитать перечень глобальных классов, переменных, которые доступны с самого начала скрипта?Вот эти всякие puts, abort(которая как я понял из класса Kernel) и т.д.
>>1377896Да, Kernelhttps://ruby-doc.org/core-2.6.2/Kernel.htmlВся базовые класса там же ^Стандартная библиотека здесь: https://ruby-doc.org/stdlib-2.6.2/
Это бот что ли эти вопросы пишет, чтобы тред не утонул?Мне скучно отвечать на однострочные общие вопросы без контекста.
Возможно я слишком усложняю задачу, у которой должно быть решение проще, но как из класса передать во второй класс объект первого класса?У меня есть класс, допустим, слушатель, который "подписывается" на класс эвент-мейкер. Когда эвент-мейкер собсна делает эвент мне надо слушателю передать время и значения эвента. Поиск по Notification паттерну нашел лишь вопросы по апишкам всяких фейсбуков и их уведомлений.Единственное до чего я додумался, это при вызове метода subscribe_to класса Listener записывать в переменную-массив класса Eventmaker текущий объект класса Listener, а при создании эвента в классе Eventmaker проходить по массиву и передавать notification в каждый объект.
>>1384962subscribe должен быть в лисенере.Попробую объяснить на каком-нибудь реальном предмете. Есть у нас телеграм-канал (класс) и пользователь (класс). Пользователь подписывается на телеграм-канал (подписка это метод класса пользователя) и после этого каждый новый пост в телеграм-канале (метод класса телеграм-канал, публикуюищй запись) отправляет всем подписчикам (классам пользователь, которые подписались) уведомление с содержанием поста. Подписчик может получить все уведомления (метод класса пользователь).
Двач, я заебался. На весь интернет два с половиной примера драй-ром-параши на рельсе, и те успели устареть. Поэтому хочу у тебя спросить: как мне в контрактах провалидировать юзера на предмет его уникальности по логину? По документации, в валидациях обращаются к Users.where, но меня посылают нахуй. Нет такого метода говорят. Без валидаций создание пользователя работает.---------------gem 'rom-rails', '~> 2.0.0'gem 'rom-sql', '~> 3.0.0'gem "dry-validation", '~> 1.0.0.rc1'gem 'dry-transaction', '~> 0.13.0'gem 'dry-monads', '~> 1.2.0'---------------require 'dry-validation'module Api module V1 class NewUserContract < Dry::Validation::Contract params do required(:login).filled(:string) end rule(:login) do key.failure('is already taken') if Users.where(login: values[:login]).count > 0 end end endend------------------------------module Api module V1 class Users < ROM::Relation[:sql] gateway :default schema(:users, infer: true) end endend---------------
>>1390592Запросы на аггрегаты пишутся внутри репозиториев. У тебя должно быть что-то типаclass UserRepo < ROM::Repository[:users] def login_exists?(login) user.where(login: login).count endend------key.failure('is already taken') if UserRepo.login_exists?(login: values[:login])
Разыскиваю "Ruby. Объектно-ориентированное проектирование, 2018", в этих ваших интернетах только 2017
>>1391491Её на русском языке судя по всему ещё не существует в электронном виде. Ищи английский вариант или читай первое издание — разница между первым и вторым минимальна.
>>1391021> key.failure('is already taken') if UserRepo.login_exists?(values[:login])Да, сработало, но пришлось в репозитории напердолить что-то типа:---------require 'rom-repository'module Api module V1 class UserRepository < ROM::Repository[:users] commands :create def self.login_exists?(login) new(ROM.env).users.where(login: login).count > 0 end end endend---------Наверняка можно сделать получше, но и так пока сойдет.
Ух, бля, ознакомительный пердолинг с драй-ром окончиль. В некоторых местах оверинженернутая хуйняша этот ваш драй-sql, конечно. Обджект релейшен маппер над релейшен маппером стоит и погоняет.Хотя в целом прикольненько. Мне понра