Это копия, сохраненная 5 марта 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Принимаются изменения в шапку треда в виде пулл-реквестов:
https://github.com/meoweg/2ch-pr-ruby
Как показывать код:
Быстро - https://pastebin.com
С исполнением - https://ideone.com
Требуется аккаунт GitHub - https://gist.github.com
Конференция
https://2chpr.slack.com/messages/ruby/
Получить приглашение: https://invite-me-to-2chpr.herokuapp.com/
FAQ:
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 Grimm
Practical Object-Oriented Design in Ruby
Refactoring Ruby Edition
Ruby 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.io
6. Что почитать по рельсам?
http://guides.rubyonrails.org
http://ruby.railstutorial.org
API: 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.com
9. Я не могу в английский, что делать, анон?
Идти учить английский, без него тут делать нечего.
10. Есть ли у руби русское коммьюнити?
Нет. Вернее есть, но оно протухло и там полно людей у которых чсв высоко.
Яркий пример - rS4subyANUSconference.R|OjabberPUNCTUMrvxxu
А еще есть русская слак конфа - 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.com
12. Зачем нужны тесты и как их писать?
http://rusrails.ru/a-guide-to-testing-rails-applications
http://habrahabr.ru/post/163597/
Вместо этого можно прочитать классную книгу Everyday Rails Testing
13. Где можно задать глупые и не очень вопросы?
- здесь
- stackoverflow.com
- тематические slack-конфы
- а вообще, гугли, с вероятностью в 90% ответ на твой вопрос уже висит на stackoverflow.
14. Как фокнуть\сделать фичу\исправить баг, сложно ли это?
Нет, не сложно. На rubyflow появляется много новостей с реализацией новой библиотеки, вы можете сделать тесты, фичу для него, старые либы также обрастают багами, улучшайте их! пишите код.
15. В чём писать код?
Atom, Brackets, Sublime Text, TextMate, Vim, GNU Emacs. Для особо упоротых энтерпрайз-макак есть rubymine, плагины к эклипс и нетбинс.
16. Можно ли писать на руби с под windows?
Можно, но придется обрасти костылями в виде виртуальной машины, придется сходу разбираться с Vagrant и многим другим. Чем дальше ты продвигаешься, тем ближе становится ясно, что пора перекатываться на linux/mac
17. Руби язык одного фреймворка?
Есть еще Sinatra, Hanami (ранее Lotus), Volt, Grape, отличные штуки для DevOps - Chef, Puppet и годные генераторы для бложиков - Jekyll, Middleman, всё это активно используется в продакшене
18. Можно ли делать игры на Ruby?
Можно, но не нужно. Гем Gosu.
19. Ютуб каналы
Youtube driven development...
Вот тебе пара каналов, но никому не говори что учишься по видео.
https://www.youtube.com/channel/UCIQmhQxCvLHRr3Beku77tww/videos
https://www.youtube.com/channel/UCfWZwsP8trUy5uHJg8gcGIQ
https://www.youtube.com/channel/UCSI77lJlzlCFPLdV1RSAoYQ
https://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_2ch
4. Не стесняемся постить свои репозитории, наши эксперты с радостью отревьювят вас.
После этого тебе будут нужны паттерны, без них твой код превратится в говно. Один из часто используемых - 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.
Зачем фортран если есть перфокарты?
"руби".capitalize
=> "руби"
"ruby".capitalize
=> "Ruby"
[/code]
Почему такую очевидной функциональности нету в стандартной библиотеке? В пистоне и джс изкоробки.
Лол, в т9 слово уже капсом. Убрал fields_for в форме, самому вручную что-ли каждый инпут теперь настраивать чтобы на сервер нормальный хеш пришёл?(
Стандартные библиотеки говно, по разным причинам.
Мне сегодня нужно было написать обработчик на какие-то урлы с русскими символами для хттп-парти.
Взял стандартный URI.encode. Отправляю запрос, а оттуда хуй вместо ответа. Начал разбираться.
Выяснилось: стандартный кодировщик вот уже (как минимум) три года не такой rfc-compliant как хотелось бы, многие uri обрабатывает неточно, а я со своей проблемой не один такой. Там же советовали гем "addressable". Поменял, и, действительно, запросы и ответы стали такими как и должны были быть.
Т.е. например мне надо запустить 10 ботов — сначала отправляем запрос к серверу, он логинится, получает куки и для каждой задачи создаётся по воркеру с уже установленными куками, и так 10 раз.
Должна ли форма искать модель, или контроллер передает ей уже найденное?
Или может контроллер передает ей только id?
Дошёл до "mysql_install_db" и получил первый пик.
Пробую "mysqld --initialize" и получаю второй пик.
На стаковерфлоу советуют удалить либо сам каталок /var/lib/mysql, либо содержимое этого каталога. Удалял содержимое каталога и пробовал снова "mysqld --initialize", в результате чего команда выполнялась без ошибок и я получал заполненный каталог /var/lib/mysql. После чего снова пробую "mysql_install_db" и получаю ошибку с первого пика. Сносил MySQL и пробовал заново. Все похожие решения на стаковерфлоу испробовал. Почему я даун такой? Почему не получается? Помогите, пожалуйста.
это ШINDOШS? Если да, то лучше ставь линукс дуалбутом #а то и дропай шиндошс к хуям#. Руби/рельсогосподам нечего ловить на шиндошс
Элексирчик такой, вот какой)
Пока некоторые вкатываются в реакт и прочую жс поебень, прошаренные поцаны щупают феникс, который по удобности, красоте кода такой же как руби, только лучше.
На руби пока есть места, даже новые проекты продолжают писаться (хотя и на пыхе они выходят). Я к тому, что это руби 2.0 в скором времени будет, все к тому и идет.
Это значит что они слоупоки и еще толком не решили как надо добавить много важных абсолютно новых фич при этом оставив совместимость с предыдущими версиями. Зато 2.4 в декабре и +5% к производительности прямо как у интела
https://youtu.be/8aHmArEq4y0
За 23 года появилось дошли до 2 мажорной версии, если считать что цикл разработки близится к концу, то можешь посчитать сколько осталось.
Это не сильно плохо или хорошо, вообще насрать какая сейчас версия. Вот то что язык развиваится, и фичи типа гильдии (см. видосик ниже) в разработке, радует, да.
Да и компилятор который умеет в минимальный статический анализ, штука
Впрочем, зацикливатся на руби не стоит, в любом случае. учи эликсир хаскель.
Ты фортран с фортом попутал и все запорол.
ОП предыдущих тредов
Ну так я на это и намекал школьничку как бы, чего ты меня хайлайтишь-то.
Эпплобляди должны страдать.
Ты бот.
https://ideone.com/M5pVTo
Суть в том чтобы метод класса возвращал массив уже инициализированных объектов другого подкласса
Просто класс в классе смотрится странно (я ньюфаг)
Ты нарушаешь основной принцип solid: каждый класс отвечает только за свою работу. Лучше так не делать, смешение логики превращает код в кашу. Очень невкусную кашу.
Твой код, можно отрефакторить через duck typing, например, так https://ideone.com/FbALvw
Теперь Api может работать с любым классом, что имеет публичные конструкторы, а не только с posts. А классы ничего не знают друг о друге.
Еще, мне не понятно зачем нужна переменная post. задачу можно решить без нее, через анонимные функции (замыкания) (раз уж ты захотел поиграться с каллбеками):
https://ideone.com/xYA62a
при этом обрати внимание, каждый вызов метода fetch_threads будет приводить к созданию новых объектов.
И, наконец ответ: лучше не писать классы в классах. На это должны быть веские причины. И даже если они есть, ты, скорее всего, делаешь что-то, что потом придется переписывать.
Как ни странно, можно без xcode. Когда будешь устанавливать brew, то тебе предложил прямо из терминала запустить команду, которая только компилятор от xcode вытащит, а не всю программу из AppStore.
Ходил кто на RailsClub? Когда выложат видео оттуда или слайды презентаций?
https://www.youtube.com/watch?v=70Q-OTl14e8
Вот ты говоришь что надо их разделить но дело в том что у меня в классе SomeApi есть метод который используется и в Post, (конкретно он генерирует часть урла для запросов, что-то вроде токена) и используется только в этих двух классах и пользователю он и не нужен (т.е. вроде и нету причины делать его публичным) но и вызвать его кроме как через instance.send :meth я не могу.
если ты хочешь нарушить инкапсуляцию объекта, то можно использовать в инстансе класса Post метод instance_eval для инстанса SomeApi. Инкапсуляцию пробьешь, но это считается плохой техникой.
Альтернатива — рефакторинг SomeApi и Post, с выносом логики которая отвечает за все что связано с токенами в отдельный класс, и может быть даже в отдельный неймспейс, чтобы оградить внутренности от взгяда пользователей.
Окей, спасибо.
Какой жу уебищный акцент, прям как у индусни, хуй поймешь
А, ну и какой-нибудь хороший код небольшого объема на почитать посоветуйте, если кто-то шарит.
Удваиваю реквест. Прагматик гайд из шапки нихуя не прагматик - дропнул это промывание мозгов, не дойдя и до сотой страницы.
Тонкости по языку:
Ю. Мацумото, Д.Флэнаган. Язык программирования Руби
О паттернах метапрограммирования:
Paolo Perrotta Metaprogramming Ruby 2
Потом, можно почитать
Рефакторинг. Ruby Edition 2009
И где-то в конце обмазаться Rails AntiPatterns. (если рельса интересна)
Это, на мой взляд, must read advanced книжки.
Теорию можно надрочить, почитав Круглова и его Ruby 2.0.0.
По коду, смотри сам, что по силам/интересно то и разбирай. начать можно отсюда:
https://github.com/markets/awesome-ruby
например, тебе наверняка будет интересно узнать какие методы есть в библиотеках, что расширяют базовые классы (чтобы потом не придумывать свои велосипеды). это библиотека facets:
https://github.com/rubyworks/facets
Тонкости по языку:
Ю. Мацумото, Д.Флэнаган. Язык программирования Руби
О паттернах метапрограммирования:
Paolo Perrotta Metaprogramming Ruby 2
Потом, можно почитать
Рефакторинг. Ruby Edition 2009
И где-то в конце обмазаться Rails AntiPatterns. (если рельса интересна)
Это, на мой взляд, must read advanced книжки.
Теорию можно надрочить, почитав Круглова и его Ruby 2.0.0.
По коду, смотри сам, что по силам/интересно то и разбирай. начать можно отсюда:
https://github.com/markets/awesome-ruby
например, тебе наверняка будет интересно узнать какие методы есть в библиотеках, что расширяют базовые классы (чтобы потом не придумывать свои велосипеды). это библиотека facets:
https://github.com/rubyworks/facets
Меня очень настораживает тот факт, что ты даешь русские названия книг - это вроде бы дает повод усомниться в твоей компетентности. С другой стороны - логично же прочитать книжку от Матца, раз уж он ее написал! Спасибо, ее и полистаю для начала.
Использовал раньше http.rb, но в один момент он вдруг отказался возвращать внятный ответ, а дело в том что он со сжатием работать вообще не умеет. Ну я такой, ладно ведь дохуя же библиотек разных должно быть. Захожу на ruby-toolbox, 1 в списке гем rest-client: не может сам автоматом распарсить json по заголовку content-type, окей 2 гем faraday: изкоробки не работает с куками, нахожу middleware faraday-cookie_jar - с куками он то теперь работает, но я получить значение этих кук не могу. Дальше идет multipart-post вообще не отдельная библиотека а расширение стандартного net/http
Ага, faraday может, но для этого надо еще строк 20 написать, опять же из коробки такого функционала нету.
Суть токова, что у рецепта может быть много ингридиентов с доп полем - количество.
У пользователя тоже может быть много ингридиентов с количеством. Ну и рецетов много может быть, но на картинке не указано.
Не слишком дичь я нарисовал тут, так и должно быть или хуйня какая-то?
хз так-то для таких ситуаций есть counter_cache http://rusrails.ru/active-record-associations#counter_cache
пишешь опцию в модель индигриенты и рецепты(для юзера), пихаешь в таблицы рецепты и юзеры столбцы с рецепты_count, и готова
Зачем тебе хранить к-во ингредиентов в базе?
Ты можешь просто написать recipe.ingredients.count
а чтобы это выполнялось без дополнительных sql запросов, делай как тебе посоветовали тут >>868712
Я кстати попытался тестировать вручную operation'ы jsonapi-resources, вместо того чтобы гонять целый стек, но чет не вышло. заебло сурцы это гема читать
Очевидно, не пользоваться ссаным jsonapi-resources, это не гем, а какая-то инвалидная параша для неумеющих в архитектуру. И вообще сам по себе стандарт JSON API мало профитов в себе несёт и кучу уродского гемора - больше похож на корявую имитацию graphql. Можно использовать, если у тебя целый зоопарк разных девайсов пользуется api( чтобы не приходилось всем вручную обрабатывать ответы), и по каким-то причинам невозможно заюзать graphql. А так других доводов в его пользу по сравнению с ad-hoc API я еще не видел.
>>868712
Так, это. Каунт != количество, не? Я конечно не сильно шарю, но по-моему таким образом я смогу узнать только size ингридиентов. Типа
>recipe.ingredients.count
>3
А мне надо иметь количество каждого ингридиента, как-то: Сыр - 100 ед., Залупа - 5 ед., Корокодил - 0.5 ед. Ну как в рецепте.
Т.е. есть таблица в которой перечислены всевозможные ингридиенты. И, например, пользователь может создавать рецепты, делая выборку из существующих ингридиентов, присваивая каждому количество. Я почитал райлсгайдсы и пришёл к выводу, что тут нужна мени-ту-мени связка. Но если между двумя моделями Recipe -> QuantityIngredients <- Ingredients всё в принципе понятно. Джоин таблица держит айди рецепта и айди ингридиента и заодно его квантити. Но если мне понадобится сюда прикрутить UserIngredients? А потом и UserRecipes, начинается казаться что получиться какая-то каша лютая из ассоциаций. Посему и советов мудрых прошу.
А вот я сразу понял, что ты имеешь в виду, в отличие от тех анонов! Лол.
Если честно, я бы не стал ебаться с джойнами, тут смысла в этом нет для таких данных, как мне кажется. Просто засунь в рецепт одно жсон-поле "ингредиенты" вида айди->количество. Или юзай монго, например.
Вообще, у тебя что, игра какая-то? Потому что если не игра, а действительно сайт с рецептами от юзеров, то АСТАНАВИТЕСЬ и ПОДУМОЙ - ты правда думаешь, что кто-то будет указывать точное количество крокодилов и сахарного песка, а потом еще и искать рецепты ровно с двумя крокодилами? Ето же оверинжиниринг как он есть.
А если ты это в качестве упражнения, то да: айди рецепта, айди ингредиента, квантити. Айди юзера, айди ингредиента, квантити. Под юзерРесипис ты что имел в виду? Просто у рецепта добавляешь поле "автор", "оунер" или что там у тебя. Если много авторов у каждого рецепта - то да, еще одну таблицу, аналогичную тем, с ингредиентами.
Готов тратить на программирование 25 часов в сутки, 8 дней в неделю! азаза, нет конечно
В сущности я хотет вкотиться в вэб. хтмл и цсс знаю более-менее. Но хочу уметь в динамические сайты.
Посему на данном этапе должен выбрать между PHP/RUBY/жабаскрипт
из знаний в программировании - забытый с института паскаль.
Вот пришел к вам за советами мудрыми - стоит ли мне начать мои мучения с Ruby? Или таки пиздовать в ПХП-тред?
Вообще в Руби сложно вкотиться?
П.С.
Тащемта я хотет себе что то типа хобби. Хочется мне изучить полезный язык программирования.
есть "русские" книги для начинающих?
Потому как в спец. литру на английском я боюсь не влезу.
Спасибо тебе за понимание, анон. Я сам-то обычно монгу и пользую, как-то так сложилось что в джс среде это первый выбор. Но хочется расширить горизонты.
>АСТАНАВИТЕСЬ и ПОДУМОЙ
Я в качестве РБД упражнения да, но что такого в точных кол-вах ингредиентов в рецептах? У меня на телефоне приложуха есть, я туда ввожу список хуйни из холодильника, а она мне выдаёт что я могу сварганить из этого. По-моему удобно.
>Просто у рецепта добавляешь поле "автор", "оунер" или что там у тебя
Да, это будет верным шагом, потому как рецепта без овнера быть не может в принципе, т.к. создавать рецепт может только авторизированный пользователь.
Меня больше всего, что смущает: это получается, что у ингредиента будет, например, четыре ассоциации.
[CODE]
has_many :recipe_ingredients
has_many :recipes, through: :recipe_ingredients
has_many :user_ingridients
has_many :users, through: :user_ingridients
[/CODE]
Это в порядке вещей? Ну и ещё интересно как работать будет сериализация, вот скажет Рецепт модель.
[CODE]
class Recipe < ApplicationRecord
has_many :recipe_ingredients
has_many :ingredients, through: :recipe_ingredients
end
[/CODE]
Если я буду эту модель сериализировать через, скажем, актив модел сериалайзер, то по первой ассоциации (has_many :recipe_ingredients) я получу то, что и должен получить: вложенный жсон аррей из { recipe_id, ingredient_id, quantity }. А вместо ingredient_id мне нужно будет подставлять реальный ингредиент, т.е. ещё один запрос в базу делать?
Вот при скаффолдинге он создает файлы типа <model_name>.js. В чем профит писать код в этих файлах, кроме, хм, разделения? Ведь все равно он сливает все в один файл и грузит все сразу в продакшене?
Допустим, у меня есть редковызываемый модал в модели users, в котором есть много js событий. Если я напишу этот код в "users.js", то лишний раз нагружу канал, все будут грузить полный application.js (а он еще по-умолчанию блочит рендеринг). Логичнее ли зделать подгрузку скрипта непосредственно при клике на модал? Вот как лучше? inline код вроде бы не rails-style.
Пользуясь случаем, /r/ гайдов по оптимизации asset'ов, самое узкое место в app у меня.
application.js по дефолту
Ты можешь добавить сколько угодно файлов манифеста, и инклудить их на вьюхи к нужным контроллерам.
Учи английский.
>>869053
Ну просто если в рецепте написано "четыре яйца", то можно сделать то же самое с тремя или двумя яйцами. Непонятно, нахуй это надо тогда - я ж не повар, мне не порцию ровно в двести граммов надо, мнетпожрать надо. Короче, лично я не вижу в этом смысла, вот. Но может это джаст ми, да и оффтоп, так что ладно.
Про запросы: http://apidock.com/rails/ActiveRecord/QueryMethods/includes ну и там дальше по докам смотри.
GraphQL ещё малопопулярен. jsonapi-resources выбрали, потому что у меня нету опыта в написании API, а нужно было быстрее (
>GraphQL ещё малопопулярен
Зато эффективен. Ad-hoc быстрее бы получился и опыт бы появился как вообще API делать "по-обычному". А это ведро с гайками не гнётся вообще никак, только круды на нем клепать. Если REST обычно в этом винят, то он хотя бы не налагает на тебя каких-то архитектурных обязательств в отличие от.
А можешь доставить ссылок на то, как рест в этом винят? Только не кукареки от петушков, а что-о обоснованное?
Мимо.
Ну, моя работа и есть ебашить круды... Я бы не смог убедить заказчика взять graphql, потому что так модно и молодежно, ему нужно быстрее, и проверенное решение.
Короче, вот есть статус у сущности (draft, published, archive). Статус выражает некоторое свойство. На него может быть завязана небольшая логика (типа нельзя комментировать в статью в архиве) или валидация.
А есть состояние, которое выглядит на первый взгляд так же как статус (new, in_progress, executed, completed, rejected). Но в отличии от статуса с состоянием связаны процессы, которые производят много действий, могут меняют этот и другие объекты. Процессы могут быть необратимые ака нельзя повернуть время вспять, особенно если связаны с внешними системами.
Вопрос - как правильно работать с состояниями?
Тут нужно объяснить, а в чем собственно проблема. И объяснить мне сложно. Но кто сталкивался, тот я думаю поймет.
Во-первых, валидации. Логично что объект должен валидировать свое состояние. Но процесс связанный с переходом намного шире зоны ответственности объекта и ему тоже нужно заниматься валидацией.
Во-вторых, действия при переходе. Они намного шире зоны ответственности объекта. Даже не заморачиваясь по поводу лучших практик, декомпозиции и слабого связывания, начиная пихать всю логику в модель, обнаруживаешь что это воняет.
В-третьих, процесс как-бы стоит над объектом, оперирует самим объектом. То есть с точки зрения объекта есть переход из A в B. А с точки зрения процесса мы из А можем перейти в B,C,D,E. И после перехода объекта сам процесс при этом еще может быть не завершен и даже откачен назад, если так решит процесс.
Вроде как для этого существуют стейт-машины. Но те гемы что есть, они эти проблемы не рашают или решают частично. Максимум что дает стейт машина это валидацию переходов виде методов can?(). Гуарды раздувают модель, обработчики (собственно процессы) не могут вместиться в реальный процесс потому что не разбирают когда нужно фактически сменить атрибут, когда сделать валидацию, когда открыть и закрыть транзакцию - они как-бы внутри объекта.
В общем стейт-машины не дают паттерна работы с состояниями, а только дают валидацию.
Не знаю, получилось ли у меня описать проблему.
Я сейчас использую ServiceObjects для самих процессов и простенькие валидаторы переходов в моделях. И в модуль вынесен небольшой функционал для трекинга истории переходов.
Но все-таки получается как-то коряво. Есть ощущение, что это делается не так.
Прошу совета гуру паттернов проектирования.
Короче, вот есть статус у сущности (draft, published, archive). Статус выражает некоторое свойство. На него может быть завязана небольшая логика (типа нельзя комментировать в статью в архиве) или валидация.
А есть состояние, которое выглядит на первый взгляд так же как статус (new, in_progress, executed, completed, rejected). Но в отличии от статуса с состоянием связаны процессы, которые производят много действий, могут меняют этот и другие объекты. Процессы могут быть необратимые ака нельзя повернуть время вспять, особенно если связаны с внешними системами.
Вопрос - как правильно работать с состояниями?
Тут нужно объяснить, а в чем собственно проблема. И объяснить мне сложно. Но кто сталкивался, тот я думаю поймет.
Во-первых, валидации. Логично что объект должен валидировать свое состояние. Но процесс связанный с переходом намного шире зоны ответственности объекта и ему тоже нужно заниматься валидацией.
Во-вторых, действия при переходе. Они намного шире зоны ответственности объекта. Даже не заморачиваясь по поводу лучших практик, декомпозиции и слабого связывания, начиная пихать всю логику в модель, обнаруживаешь что это воняет.
В-третьих, процесс как-бы стоит над объектом, оперирует самим объектом. То есть с точки зрения объекта есть переход из A в B. А с точки зрения процесса мы из А можем перейти в B,C,D,E. И после перехода объекта сам процесс при этом еще может быть не завершен и даже откачен назад, если так решит процесс.
Вроде как для этого существуют стейт-машины. Но те гемы что есть, они эти проблемы не рашают или решают частично. Максимум что дает стейт машина это валидацию переходов виде методов can?(). Гуарды раздувают модель, обработчики (собственно процессы) не могут вместиться в реальный процесс потому что не разбирают когда нужно фактически сменить атрибут, когда сделать валидацию, когда открыть и закрыть транзакцию - они как-бы внутри объекта.
В общем стейт-машины не дают паттерна работы с состояниями, а только дают валидацию.
Не знаю, получилось ли у меня описать проблему.
Я сейчас использую ServiceObjects для самих процессов и простенькие валидаторы переходов в моделях. И в модуль вынесен небольшой функционал для трекинга истории переходов.
Но все-таки получается как-то коряво. Есть ощущение, что это делается не так.
Прошу совета гуру паттернов проектирования.
Не моя, а твоя. Тебе в другой тред.
Короче, я не гуру, но мне тоже интересно, так что напишу свои мысли, по абзацам.
Зачем ты про статус вообще говорил, если у тебя вопрос про состояния?
Объект не должен валидировать свое состояние, он его должен молча хранить. Отдели данные от логики же.
Стейт-машина конечно нужна, но по-моему совсем необязательно тащить либы для этого в код. Тебе просто нужно нарисовать в любом редакторе эту самую стейт-машину со всеми переходами и ичпользовать ее как документацию\спецификацию.
Не очень понятно, в чем именно у тебя проблема, потому что сложности тут должны возникнуть с асинхронностью, хранением истории и откатами, ненадежностью внешних сервисов и обработкой ошибок... а ты спрашиваешь, пихать валидацию в данные или нет. То есть непонятно, какая у тебя в целом структура кода. По-моему ключевым решением тут было бы, например, хранение данных в иммутабельных объектах, чтобы нахаляву получить историю и откат, ну и что-то эвент бейзед с каналами, чтобы не было коллбэк хэлл. А сверху приправить монатками чтобы грациозно ловить фейлы от внешних сервисов ладно шучу
я не стал мемоизировать, потому что status может поменяться, а #strategy будет возвращать неправильный объект.
И поэтому решением будет инкапсулирование логики в фабричный метод, а не ссылка на конструктор класса напрямую.
Заодно, >>869446 решит свои проблемы с
> И после перехода объекта сам процесс при этом еще может быть не завершен и даже откачен назад, если так решит процесс.
реализацией транзакций и валидаций.
Кстати да, спасибо. Будет время отрефакторю, там еще много дерьма всякого (
Привет ребята! Я психолог кун, вкатываюсь в жс и заодно хочу написать о связи популярных языков (петон, раби, жиес) с нетрадиционной сексуальной ориентацией.
Есть готовые поделиться своим опытом разработки?
get(args)
request(args, method: :get) #приватный
end
Как запретить вызов get(1,2, method: :post) ?
Или я придумываю себе проблему на пустом месте и можно просто в доках написать какие параметры можно передавать в метод get и не париться ?
Примеров в нете нету, только пустой репозиторий на гите с каунтер аппом. Я даже не могу сделать чтобы js.erb говно работало.
Спасибо, сам до такого же додумался.
Аноны, поделитесь исторями успеха, а то в дизморали нахожусь.
спами повсюду свое резюме, даже если в вакансиях ты ненужен, если есть интересное портфолие то могут предлоть чтоолибо
Бля еще читать, у меня уже вкладок 15 схоронено с документацией. Конечно когда-то дойду до них, но сейчас мне бы хоть разобраться, пилить фронт нужно полностью на реакте, или только компоненты с ебанутой логикой?
А то я попытался запилить примитивный хедер в котором одни кнопки у юзера и другие у гостя и соснул.
Хедер это вообще компонент или контейнер?
Можно и так, и так. Можно даже несколько рутов иметь. Не еби мозг, делай все через реакт.
Да бля
Вопрос офк не в программач, но я не ебу как
Передаю я допустим в компонент обьект юзера. Это просто джейсонина с данными из модели
Если мне нужно в компоненте чекнуть значения каких-то методов модели, передавать их отдельно?
Ну это хуита, вот другое, пытаюсь ебануть js.erb чтобы хоть урлы забрать из аппа, инстантли сыпется и говорит browserify error import or export can be included only within sourcetype module.
И в гугле нихуя по этому поводу нету
Никак, блядь. Пайплайн хуй говно остой пидорский, последний раз пользовал 4.2.6 и надеялся что в пятые рельсы наконец-таки подвезут фронтенд суппорт нормальный, но хуй там. Вчера весь вечер и пол ночи сидел ебался с этими обоссаными гемами, такая ересь ебаная. Сегодня утром сел, уебал нахуй с вертухи весь assets/javascripts, создал отдельную папку, поставил туда всю человеческую инфраструктуру, настроил вебпак с аутпутом в assets для прекомпайла, организовал себе через хелперы хотрелоад, и написал на реактоне с редаксом весь UI за пол дня. В рельсавьюшке осталось в итоге:
[CODE]
<% if user_signed_in? %>
<main id="app"></main>
<% else %>
<%= yield %> <-- devise login page
<% end %>
[/CODE]
Все данные через актив модел сериалайзеры гоняю, этот джбилдер по-моему какая-то помойка. Остался конечно вопрос с менеджментом сессии в приложении, но это дело житейское. Думаю просто поллить рельсы раз в n-секунд на акшен вовзращающий стейт авторизации и на клиенте соответствующим образом реагировать.
У тя это говно ентерпрайз, или дашь попалить?
Ну дык
Я же говорю
Есть обычный фронт на аштиемеле
Там я вывожу Х если у юзера одно говно или У если другое
Чтобы ебануть эту же проверку в реакте, нужно датой в компонент передавать результат этой проверки, так?
А что если в разных кейсах я передаю от 0 до кастомного числа таких проверок?
Ты дичь какую-то несешь. Передавай на клиент своего юзера жсоном, и там уже, на клиенте, делай с этим жсоном какие хочешь проверки. Если у тебя проверки только на сервере могут быть сделаны, то шли запрос на сервер, жди ответа, обнновляй состояние. Я вообще не понимаю, в чем у тебя проблема. У меня такое чувство, что ты хочешь руби-код с сервера на клиенте исполнять, или я не ебу, что еще.
Не, нихуя
Самое элементарное, у юзера есть метод xuesos?
Который пляшет не от поля в модели, а от какой-то другой хуиты. Когда я передаю юзера в компонент, и хочу заодно в компоненте чекнуть xuesos? ли он, тогда нужно ретурн велью xuesos? передавать отдельно, так?
Предположу что так, тогда смотрим дальше
Если юзера вообще нет, я хочу рисовать две строки
Если есть, три, а если есть и хуесос то четыре
Мне в пропс нужно передавать всегда все эти значения ("типа" если юзер есть, то это user: user, xuesos: user.xuesos?) а если нет, то чтобы на клиенте это чекнуть все равно нужно передать и то и то в пропс, но пустое. Так?
Сорри если хуево обьяснил
> Нихуя
> Хуесос
> Хуеты
> Хуево
Блядь, чувак, тебя в детстве батя выебал, или что? Ебаный стыд же, господи иисусе!
Ты передаешь компоненту все, что ему надо для рендеринга, а уж откуда и как - это твое дело. Ну или я нихрена не понял, что ты спрашиваешь, пусть тебе кто-нибудь еще посоветует, короче, я не врубаюсь, сори.
Деградирую, уже не могу нормально выражаться, что я сделою. Прогать на рельсах ни разу не стимулирует мозговую активность я тебе скажу
бампули
По ходу нет. Окей. Придумал следующий гениальный костыль. Написать хелпер типа link_helper.js который возвращает хеш внутри которого хеши по скоупам, внутри которых пары ключ - урла. После чего инклюдить этот хелпер в компонентах и юзать урлы оттуда. Очевидно что для этого я ембеддед руби тоже не заюзаю, значит надо как-то генерить его из роутов. Я чекнул пару результатов по generate asset rails и generate file rails но там не то. Эни айдиас? Или это вообще не нужно?
react on rails юзаешь?
ты неправильно готовишь реакт с рельсами. ВООБЩЕ СУКА НЕПРАВИЛЬНО 100500 ТУТОРИАЛОВ БЛЯТЬ ЕСТЬ
Где же они? Чет я нихуя не нашел кроме каунтер аппа, аппа для учета расходов и говночата, и все 2-3 летней давности, а самое примитивное вообще не обьясняется
инбифо у меня должен быть СПА без ссылок
Обязательно? Основы программирования и ООП я уже знаю, пишу на крестах, но деньги понадобятся раньше, чем я смогу их заработать плюсами.
Ну, я хз как можно вкатиться в рельсы, не зная html. Ты тупо не поймешь о чем идёт речь. Потрать недельку на втыкание в htmlbook и написание бложика.
Блядь, что-то мне не нравится такая связь между хаскелем и трампом. Трамп - это пхп. А Хиллари - это джава, угу.
мимо
Они оба/обе за галерный аутсорс, так что нахуй их с пляжа!
Я лично буду молиться за либертарианского кандидата Джилл Стайн.
Нет, учи Mercury и LambdaProlog.
Ясно что будет, кроме него не как не покрасить сайт
Руби безумно популярен и в вебе и просто в софте
Там же инфа за 14 и 15 год.
По-моему тебе еще неделю (или сколько там) назад об этом говорили.
вот этот хуй пили нечто подобное
http://alexfedoseev.com/post/55/react-and-rails-isomorphic-awesomeness
bets = Bet.joins(:nested_bets)
bets = bets.where('nested_bets_count > 10')
а вот так работает:
bets = Bet.order("#{sort_column} #{sort_direction}")
bets = bets.where('nested_bets_count > 0')
bets = bets.where(game: a_game_filter)
я знаю что joins как-то по-другому работает, но я не понимаю как сделать так чтобы я мог делать то что я хочу. Почему я не могу после joins еще делать query всякие? :(
Потому что скул запросв надо писать, сюрприз, на скуле, а не ебаться с ненужными слоями "абстракции".
>>872251
спасибо, но ведь абстракции были для удобства сделаны, наверняка можно что-то сделать, просто я ещё не знаю как
что?
Всё, я понял, надо использовать includes вместо joins.
Стимул пойти и выучить наконец SQL.
Т.е. например синтаксис для создания symbol: key намного приятнее но когда хеш приходит из другого источника то там обычно строки как ключи, и тогда ф-я в которой ты обращаешься по символу уже не работает. Это же больше невнятности вносит чем помогает.
Ну я знаю что так можно, но какая вообще стандартная практика, когда их надо а когда не надо использовать ?
> но какая вообще стандартная практика
Ключи в хеш таблицах должны быть иммутабельны.
Приводится 2 агрумента:
1. сравнения по иммутабельным строкам (symbols) быстрее.
2. вероятность, что ты проебешь hash[key] снижается.
---
Ответ, когда их надо использовать, а когда нет ты найдешь если почитаешь вот эту хуйню:
https://github.com/bbatsov/ruby-style-guide#symbols-as-keys
Тейблнейм.колумннейм
Анон, что запилить на рельсах как пет проект?
Что не стыдно будет показать при приеме на работу. Иными словами какой сайт сделать?
Стоит ли с Java переходить на руби?
Запили сайт с ачивками. Пользователь создает себе задачу "Накодить двач" или "выпилится" лол выставляет время 3 недели. Переодичски отмечая свой прогресс, пользователь получает это достижение. Потом в страничке своего профиля сможет пофапать на них. Можно сверху запилить сообщества, набры стандартных достижений, друзьяшек, ачивку дня и т.д.
Вот такое вот вэб-приложение мотиватор.
Ну я бы не советовал. Жава господам просто неудобно будет с удобной и юзер-фредли жабы пересаживаться на руби.
Хаскель норм, даже веб на нем есть.
Потому что утверждение "хаскель норм, даже веб на нем есть" истинно.
>>874151
Не писал на хаскеле ничего серьезнее хелоу ворлда.
НО знаю, что есть не мало сайтов на нем, даже борда русскоязычная на хаскеле написано. И это не шутка.
Плюс фреймворки от эрланга набирает неплохо обороты. Там свои нюансы, но производительность и скорость выше той же ноды или руби.
Имхо если вкатываться джава анону, то в какую то из этих технологий.
Опять же на руби по прежнему много работы, в ближайшее время ее не убавится, а язык все такой же приятный для пользования.)
Ну вот у меня и была такая мысль, заняться руби и потихоньку смотреть/изучать на эликсиры с фениксами, а там как взлетит.
Еще есть мысль в мобайл(iOS) переключиться, но не знаю стоит ли того, все таки другая область, да и не понятно как-то все будет в ближайшее время. Для себя пару приложений запилил таки.
Я бы не стал. Сам сейчас сижу на руби и эликсире + фронтенд. Но все эти рельсы, активрекорды, кукумберы, динамика, диалайзер-костыли меня уже доебали (а вот фронтенд в умеренных количествах нравится пописывать). Планирую перекатывать на скалу, в кровавый энтерпрайз, но понимаю, что джавой тоже придется скорее всего заниматься.
Алсо, расскажи почему вообще возникли мысли о переходе с джавы на руби?
Ну или в совсем крайнем случае писать фронтенд на TypeScript'e. React + Redux + Immutable.js пробовал, понравилось. Да, есть бойлерплейт, но это лучше, чем метаадок рельсов.
Можно конечно же gsub-ом заменить все \r\n но это же костыли.
Пиздец как я охуел когда регекс у меня один файл парсил а второй нет из-за этой хуйни.
Имеет смысл разрабатывать фронтэнд как отдельное приложение? В отдельной IDE, с отдельным проектом и все такое. Если да, то как? Где-то еще видел инфу, что для этого отдельно имеет смысл поднять ноду и весь js делать через нее, а часть представления из рельс вообще убрать. Поделись советом.
Да, фронтенд отдельно. Рельсы потом можешь выкинуть и заменить на ноду\кложурьскрип.
Пилю фильтр на Ransack. Например, есть person у которого has_many cars и has_many bikes. Мне надо запилить чекбокс, который вернет всех person у которых есть хотя бы один байк.
ХЕЛП!
Есть две rails-апликухи.
Первая на рельсах 4.2.6, вторая на 5.0.0
Из второй апликухи надо сделать mountable engine для первой.
Возможно ли это с сохранением версий рельс для обоих апликух?
Эта штука создает для каждой таблицы в которой надо хранить поле на нескольких языках дополнительную таблицу model_translation. Я только начал создавать бд и у меня уже есть 5 вспомогательных таблиц, которые имеют связь с основной, 4 из них должны иметь переводы. Получается надо делать джоин на 5+4=9 таблиц и это только начало, это норма или нет ?
Выглядит как оверинжениринг для 90% проектов. Ты что там, фейсбук пишешь? Добавь title_ru, title_en и не еби моск.
Так это получается надо будет костыли в виде хелперов на каждый атрибут писать вроде if current_locale == :en
Можно в модели виртуальный аттрибут запилить но это тоже немного костыльно.
Как globalize, только не плодит кучу ненужных таблиц. Нужен postgres, но все и так им пользуемся, верно?
Это как?
Нужно писать человеческие запросы
Это работа для человека-декоратора!
class UserDecorator < SimpleDelegator
def attribute
public_send("attribute_name#{locale}")
end
end
Использую на 4-х рельсах, все ок. Там кода полторы строки, если чо надо - форкни да напиши.
И потом разбирайся кто где продекорирован, а кто нет. Лучше уж явно это как-то сделать.
Видео с RailsClub 2k16:
https://www.youtube.com/playlist?list=PLiWUIs1hSNeOXZhotgDX7Y7qBsr24cu7o
спасибо, правда чёт пока первые две просмотренные видяшки не зашли.
где Матц рассказывал про рельсу (лол).
и где сорок минут какой-то хер рассказывал про ракетовелосипедостроение и основы ооп.
ТЕПЕРЬ ТО ЧТО НЕ ТАК?
1) попробовал вообще убрать ковычки кроме ключевой фразы ("Demo Blog") - undefined method `content' for RSpec::ExampleGroups::StaticPages::HomePage:Class
2) попробовал сменить '' на ' - та же ошибка, что и раньше. Попробовал скопировать код из книги без своих изменений(Demo Blog -> SampleApp) - нихуя.
я испытываю анальные боли и желание начать изучать другой фреймворк для блистательного влива в быдлокодеры
в общем, нашел нестандартный солюшн.
1) нужно обновить капибару до выше, чем 2.2, посылая нахуй требования учебника в 2.1
2) нужны gem 'database_cleaner' в гемфайл,
require 'database_cleaner'
require 'capybara/dsl'
для спек и рейлс хелперов в папке /spec/
3) много ебаться.
бля парни rails / ruby учить уже реально поздно. вот реально, вы потом вспомните мои слова. спрос скатился на нет. инфа от инсайдера руби тусковки
Какой-то ты неумный, если для тебя декоратор здесь - серебряная пуля.
декоратор не нужен: хочешь написать свой велосипед — добавляешь в модель миксин, который подгружает аттрибутов модели, где-нибудь берет для этих аттрибутов локализакию и как-нибудь мутирует модель, добавляя названия.
Но и это не нужно, потому что есть гем.
дело не в кавычках, достаточно было посмотреть что у тебя красным текстом написано: 'rack-test requires a rack application but none was given'
Ну и соответственно, гугол первой же ссыкой дает решение:
http://stackoverflow.com/questions/17666623/running-capybara-without-rack-produces-errors-when-using-url-parameters
Так что могу предположить: ты написал какую-то дичь в config.app, а при обновлении капибары файл был перезаписан и все внезапно заработало.
ну и возможно, я бы даже почитал вторую ссылку, ответ из нее более ревалентный, на мой вгляд:
http://stackoverflow.com/questions/25831227/railscapybarapoltergeist-argumenterror-rack-test-requires-a-rack-application
---
Кавычки в твоем случае, вообще ни на что не влияют, т.к. разницы значимой разницы между
expect(page).to have_content ''yoba"
expect(page).to have_content 'yoba'
нет.
>>878191
как видишь, я частично пользовался этими ссылками чтоб решить проблему. А конфиг я не трогал, такие дела.
Я третий день ваш этот руби изучаю и просто делаю по книжке, ничего не кручу и не трогаю. И получаю уже третий баг. автор - пидор
А другие книжки не настолько полные/удобные к прочтению.
Без миксинов ты в любом случае нарушишь DRY в случае если нужно задекорировать больше одного ActiveRecord класса.
2. ActiveRecord это антипаттерн, так что SOLID боги обмазаны гавном by design, увы.
3. Ты нарушаешь KISS, мне блядь нужно будет помнить о 50 задекорированных классах. Нет, спасибо, пусть миксин декорирует.
Вообщем, когда я и остальные люди в подобных случаях просто будут использовать ' include MyTranslationModule' в соотв. модуле (или гем, что автоматом заинжектит 'MyTranslationModule' во все модели ActiveRecord) ты ебись со своими декораторами, кловун.
Начитался блядь книжек о паттернах, а как их использовать не понимаешь.
DRY в случае рельс это нередко перегиб.
То что там есть уже говно в рельсах, не значит, что нужно еще больше накидывать. У тебя весь код, нужный для presentation layer лежит в модели, да? лол, если правда.
А мутировать или перезаписывать методы эктиврекорда это вообще моветон, так пишут только мудаки, вдохновленные DHH
> А мутировать или перезаписывать методы эктиврекорда это вообще моветон, так пишут только мудаки, вдохновленные DHH
Давай теперь весь параметрический полиформизм отменим, ведь анон на дваче сказал: 'ПЛОХА'
> DRY в случае рельс это нередко перегиб.
обоснуй где конкретно перегибы, и почему они настолько серьёзны, что перевешивают минусы влажного кода (WET).
> То что там есть уже говно в рельсах, не значит, что нужно еще больше накидывать.
Так ты его и накидываешь, плодя лишние сущности, там где это не нужно.
Стой стой стой, не уходи от сути. Ты считаешь, что модель должна иметь доступ к контексту I18n и вообще заниматься облагораживанием сырых данных для юзера?
Не обязательно юзать декоратор, даже хелпер будет лучше того говна, которое ты предлагаешь.
Чувак же изначально говорил, что у него в базе хранятся строки на разных языках, полученные от юзеров. В таком случае это не и18н в привычном понимании. Это безусловно часть модели.
мимо
Ну? Не вижу, чем это отличается от "ему нужно выбрать определенный блог-пост, основываясь на запрошенном айди", например.
Он хочет модуль добавить, который автомагически будет всё делать, основываясь на текущей локали, а не вручную писать
def translated_attribute(locale)
end
> Ты считаешь, что модель должна иметь доступ к контексту I18n и вообще заниматься облагораживанием сырых данных для юзера?
напрямую, не должна. Через делегаторы в миксины может, на эту тему можешь почитать rails antipatterns.
Как общее решение есть drapper, но это тоже то еще говно, хотя и лучше того, что ты предлагаешь.
Для единичных случаев сойдет хелпер.
> Не обязательно юзать декоратор, даже хелпер будет лучше того говна, которое ты предлагаешь.
Нет, не будет. Там выше, бтв, давали ссылку на гем, что делает примерно тоже самое, о чем веду речь.
Подумай сколько декораторов и кода придется писать для >>877340 решения и для пикрелейд.
p.s..за DRY в Rails пояснить в этот раз не забудь.
Ну этот модуль уже будет к контроллеру относиться, а не к модели, да. Впрочем, непринципиально.
>Нет, не будет
Почему нет? Хелпер явно вызывается, а декоратор мимикрирует под оригинал, и поэтому не нужен. Это экономит кучу времени и нервов в будущем.
Эм,
class I18nDecorator
...
end
Тверь серьёзно хочешь писать декоратор для каждоцифрового модели? Лол.
Для каждой модели *
> декоратор мимикрирует под оригинал, и поэтому не нужен
Ок, иди ^нахуй^ пиши всю логику модели в хелперы, он ведь явно вызывается.
Спор идет о форме декоратора, хуй выше предложил на каждую модель хуярить по классу, я сказал — нахуй; хватит (неявно подгружаемого) миксина и одной строчки в декорируемую модель.
>>878619
> Тверь серьёзно хочешь писать декоратор для каждоцифрового модели? Лол.
это вот этот >>877340 хочет писать на каждую модель по классу-декоратору.
p.s. Если ты — все еще он, то, кловун, поясни чем тебе не нравится DRY в Rails (3).
Ткни, где тебе предлагали писать по декоратору на модель. То, что так делает драпер, не значит что декоратор везде так применяется, маня
>пиши всю логику модели в хелперы, он ведь явно вызывается
Если так упарываешься паттернами, нахуя тебе модель? Какая в ней логика должна быть? Ее вообще нужно заменить на датамаппер, хуесос ты диванный
> Ткни, где тебе предлагали писать по декоратору на модель.
Там, выше (>>878681) есть ссылка на этот код, где ты показываешь на примере UserDecorator как плодить лишние сущности, как мудак, что не знает, о понятии Бритвы Оккама.
Но ты и дальше продолжай в глаза долбится, кловун.
Нахватался баззвордов, а смысла не понимаешь. Даже не можешь свою позицию толком объяснить, только вопросы типа: "ОЛОЛО, а зачем нужен ХЕЛПЕР???", задаешь. Но, зачем, спрашивается, вопросы задавать, если ответы которые ломают твой мир, отрицаются, жертва Стокгольма, блядь.
>>878732
> Если так упарываешься паттернами, нахуя тебе модель?
Иди нахуй, с такими вопросами. Разберись, для начала когда код идет в хелпер, когда в модель, когда блядь нужно подключать враппер и минусы и плюсы каждого подхода.
Тогда и поймешь, когда имя аттрибута кортежа декорируется, а когда достаточно вынести код в хелпер вьюшки (подсказка, дело в DRY, за который ты по-человечески пояснить не в состоянии (три раза, кловуна, спрашивал), только громко кукарекаешь : 'ко-ко-ко DRY в рельсе не нужен, КО-КО-КО вредно, ко-ко-ко боги SOLID'.
Вообщем, порвался, с придурка. В игнор, иди дальше сука плоди свое говно, вида: class UserDecorator, class OfferDecorator, class TvouaMamashaDecorator, вместо миксина и вызова однострочного метода. Да и не забывай, половину логики в хелперы пихать, чтобы твой сука, код ещё больше на лапшу походил, бог solid, блядь.
Че ты несешь, шизоид? Нас здесь больше двух.
Декораторы и хелперы в данном случае - альтернативы, а не дополнения друг к другу, ебанутая истеричка.
Так что там насчет датамаппера? И DRY не всегда нужен
Поясни нам, далеким, как надо.
Мамкин DHH порвался, несите ActiveRecord::Base.suppress
Ты шо, даун? Это пример для одной модели же, где ты по декоратору на модель увидел ?
По разному можно. Самый простой способ реализовано в react-Rails. В react on rails уже юзается вебпак а рельсовый пайплайн лишь в продакшене
Я тоже пытался спросить об этом здесь >>875787, но на самом деле не понимал сложности вопроса. 2-3 трудных дня у меня ушло только на общение с гуглом. Признанной лучшей практики на этот счет я найти не смог и даже не совру, если скажу, что вполне равноправных рабочих решений существуют десятки.
Как мне показалось, варианты с js-библиотеками запакованными в гемы не очень жизнеспособны. В современном js слишком много зависимостей от сторонних инструментов и в итоге либо ты будешь работать с неполным функционалом, либо постоянно ковыряться под капотом. "Экосистемы" рельс и js трудносовместимы, поэтому не получится просто разобраться с одним фреймворком js, а нужно научиться работать со всеми зависимыми штуками вплоть до самой ноды. Для себя я нашел два лучших решения: https://medium.com/@alexfedoseev/isomorphic-react-with-rails-part-i-440754e82a59#.qh8wp91qe и
http://www.railsonmaui.com/blog/2014/10/03/integrating-webpack-and-the-es6-transpiler-into-an-existing-rails-project/
Между прочим, хорошая иллюстрация различия философии руби и остальных языков. Если гемов в общем доступе на сегодняшний день около 100к, то пакетов для js уже больше 500к. При этом в js гораздо больше вариантов решений одной и той же проблемы, каждое из которых не доработано. Благодаря синтаксису и архитектуре руби люди с большей охотой разбираются в чужом коде и дорабатывают существующие решения, когда в js никто не хочет разбираться в чужом некрасивом коде, а просто начинают по сто раз изобретать один и тот же велосипед. Мне кажется, именно это и делает руби языком будущего вопреки трендам и проблемам с быстродействием.
> руби
> язык будущего
Ахахаха, ну ты и юморист, брат!
Единственная причина, почему у жс в стопицот раз больше пакетов, до ужаса проста: он в стопицот раз популярнее руби\хуюби\языкнейм, все.
ну раз один класс, то это очевидный модуль, а раз модуль, то почему бы и не миксин. верно? или ты любитель паттерна 'синглтон'?
Создаем отдельный модуль с названием, например, AttributeTranslator у которого добавляем статический метод translate(object, prop, lang), который выглядит как-нибудь так: object.public_send("#{prop}_translations")[lang].
Плюсы:
В отличие от хелперов доступен везде, но при желание его вызов можно обернуть в хелпер.
Не нужно добавлять миксины в модель и засирать ее логикой (привет, DHH).
Легко тестируется + для тестирования не нужно создавать тяжеловесные инстансы AR, достаточно обычного PORO.
Развели тут декораторы, миксины в модель, вообще охуеть.
> ну раз один класс, то это очевидный модуль, а раз модуль
С фига ли? Ты когда хочешь приклеить стикер с хуями к своей жопе, требуешь чтобы на все жопы лепили такие же стикеры?
Так вот и я о чем. Выше писал, что декоратор это просто пример, можно и хелпер, можно многое придумать, лишь бы не срать в модель как того хочет dhh-кун.
А может это просто люди пилят тот функционал который в нормальных языках уже есть в стандартной библиотеке?
Я просто жду, пока WebAssembly не станет доступным на 70%+ устройств. Пока посижу на бэкенде, устраивать анал карнавал с ЖС совсем не хочется.
Да без разницы, что они пилят, хоть твою мамашу своим хером. Язык популярнее => пакетов больше. Все, тхет симпл, бро. Кода на жс уже наверное больше, чем на джаве.
>>877315
>>878932
Пора двачу пилить свой гем, лол.
>>878958
И что тогда ? Сделают транслятор си/жабы/руби/питона в жс ? Нет, ведь тогда надо будет тащить кучу зависимостей по сети.
ты непоследовательный хуй.
Давай всю логику над примитивами вынесем в отдельные модули. Не ну а чё, Матц засоряет String методами типа upcase. Если в дефолтном руби держатся библиотеки, типа Enumerable, то почему ты, хуй, кукарекаешь на библиотеки с аналогичной логикой работы уже в Rails?
То, что модели active record перегружены — другой разговор.
Короче говоря, ты призываешь велосипедить, потому что до тебя повелосипедили, я понял.
>>878932
Если бы так изначально предложили, я бы и спорить не стал, просто этот вариант с
class UserDecorator < SimpleDelegator
…
end
совсем уж уебищный, по мне так.
>>878958
Когда я последний раз на него смотрел, они говорили, что это не будет заменой жс в качестве компайл-таргета. Что-то изменилось? Или чего ты ждешь?
Почему в одни объеты ты срешь и не замечаешь, а для других объектов внезапно просыпается чистоплотность? Избирательный говноед?
Какой злой школьник.
>Кода на жс уже наверное больше, чем на джаве.
Я то думал что предназначение динамических языков в том чтобы писать меньше а делать больше, оказывается во вселенной джса все по-другому.
>>878969
Сути не меняет.
Вот, двачую тебя. Только зря ты распинался перед тупарями, пускай опыт зарабатывают.
в String включен модуль Comparable, который делает какую-то полезную работу.
в ActiveRecord::Base, есть миксин Translate4OTOTAM, который делает какую-то полезную работу.
В первом случае ты жрешь что дают, а во-втором внезапно просыпается твое: 'КО-КО-КО миксины не нужны, давайте захуярим классы, наследование и далее по списку'. Нечистоплотный дурачек, да и только -.-
Предупреждаю, я другой анон.
Потому что блять любой хуесос как ты может открыть документацию и прочитать про офффициальный насраж от рельс и т.п. Да, это говно, но это знают ВСЕ. А мне разбираться в твоей личной недокументированной дрисне потом? Да ну нахуй.
Ну ок, но он же предлагает самому замиксинить, вот это и есть самое западло.
>>878984
Тебе 3 анона сказали, что ты со своими миксинами можешь идти ебаться с DHH, а ты стрелки переводишь.
Проекции от тебя еще в прошлом посте пошли, привет.
>>879080
Ну так именно поэтому они (авторы стандарта) и говорили, что оно не будет являться заменой жс в качестве компилейшен таргета. Где ты увидел противоположное утверждение, можешь линк доставить?
Из вас троих только один отвечал адекватно >>879014
Ты со своим дружком задавал бессмысленные вопросы, да сводил все к личному срачу, кловун.
Это решение, с миксинами, бтв используется в globalize и его производных.
И ни одного валидного армента против ты не смог привести.
Единственное, что мне разумным показалось, так это аргумент по усложнению уже засранного active record. Впрочем, это в первую очередь, к мейнейнерам active record вопрос.
Но, есть и другие решения.
вот, Draper::Decorator, например. Близко к варианту с кучей классов декораторов. Можешь почитать, как поливают говном,
Или простое, по-своему красивое, решение, в виде хелперов:
module ApplicationHelper
def present(model)
klass = "#{model.class}Presenter".constantize
presenter = klass.new(model, self)
yield(presenter) if block_given?
end
end
Вообще много чего есть.
----
А теперь ты можешь и дальше покрывать меня говном, приводя в аргументы количество, лол, человек.
Но уж прости: в этот раз уж постараюсь не реагировать буду на подобные высеры, хватит уже, покормил.
Из вас троих только один отвечал адекватно >>879014
Ты со своим дружком задавал бессмысленные вопросы, да сводил все к личному срачу, кловун.
Это решение, с миксинами, бтв используется в globalize и его производных.
И ни одного валидного армента против ты не смог привести.
Единственное, что мне разумным показалось, так это аргумент по усложнению уже засранного active record. Впрочем, это в первую очередь, к мейнейнерам active record вопрос.
Но, есть и другие решения.
вот, Draper::Decorator, например. Близко к варианту с кучей классов декораторов. Можешь почитать, как поливают говном,
Или простое, по-своему красивое, решение, в виде хелперов:
module ApplicationHelper
def present(model)
klass = "#{model.class}Presenter".constantize
presenter = klass.new(model, self)
yield(presenter) if block_given?
end
end
Вообще много чего есть.
----
А теперь ты можешь и дальше покрывать меня говном, приводя в аргументы количество, лол, человек.
Но уж прости: в этот раз уж постараюсь не реагировать буду на подобные высеры, хватит уже, покормил.
>Да без разницы, что они пилят, хоть твою мамашу своим хером.
Залетный петушок обитает в нашем уютном треде
Я от всех хуйни с локализацией и просто отпишусь о декораторах.
Декораторы в том виде в котором их зачастую используют в рельсо-комьюнити и как предлагаешь их использовать ты - это полная хуйня. Я понял бы, если создавалось много декотораторов для каждой модели, например, UserDecoratorForProfile, UserDecoratorForBilling и тд, а не как сейчас одна модель - один декоратор. При таком подходе фактически код модели размазывается на два файла, профита от таких декораторов никакого, да еще и оверхед от кучи вызовов method_missing.
да, презентеры полезнее.
Все перешли на эликсир и кложурь, можешь не париться.
мало что изменилось. разве что реакт добавляют на фронтенд, если jQuery стало мало.
chef+capistrano, из того что я видел.
Поясните почему не меняются значения в хэшэ?
Нужно заменить ["1","2","3"] на ["a","b","c"], но почему-то изменения не сохраняются.
пиздуй на udemy, но там нужны бабосики (не рубли) платить
require 'json'
data = '{"json_class":"RPG::EventCommand","type":"Show Text","parameters":{"json_class":"TranslatableArray","original ":["xuy"],"translation":["1","2","3"]}}'
hash = JSON.parse(data)
words = ["a", "b", "c"]
hash['parameters'].each do |ex|
if ex[0] == "translation"
ex[1].each_with_index do |el, index|
ex[1][index] = words[index]
end
end
end
puts hash.to_json
Как выполнить действие точно при наступлении конкретной даты и времени указанного в поле бд. Поясню на примере: есть приложение для мониторинга выполнения задач. Создаем задачу, устанавливаем дату+время до которого задачу надо выполнить. Позже при наступлении указанного времени надо проверить завершена ли задача, если нет, надо отправить email о том что сроки нарушены.
Из очевидного приходит в голову дергать бд каждые n минут, но возникает подозрение что это немного костыльно. Алсо задания могут создаваться отдельным приложением к оторому я не имею доступа.
это чтобы не дергать каждый раз бд.
Чтобы действие выполнять по сроку пощупай cron обертку какую.
Это костыль с точки зрения Unix philosophy. Она хоть, устарела в части 'use text streams', но неважно.
Я предлагаю, простое решение.
Отдельно менеджер, который запустится. Проверит задачи на ближайшие n часов, добавит нужные в крон, уснёт.
Задача. Вызывается из кроном, порождает дочерний процесс, снимает с него результат. Что-то делает на основе результата.
Всё что нужно, аккуратно выбрать пару гемов.
Ну я уже вижу баг - а что если время окончания задачи поменяют уже после того как менеджер проверил задачи ?
Алсо я говорил о задачах которые таски в проекте (для управлениями которыми созданы basecamp/jira/trello)
>>883385
Вот этой штукой я буду отправлять email, с этим вообще проблем нету, вопрос то не в этом.
>Programming Ruby (The Pragmatic Programmers Guide)
Ничего что книжке почти 4 года а язык модный современный развивающийсянет?
> Ну я уже вижу баг - а что если время окончания задачи поменяют уже после того как менеджер проверил задачи ?
Погуглил чуть-чуть, если нельзя перекэшировать даные каждые n минут, то другой вариант заключается в том чтобы повесить триггер на базу данных, дабы она уведомляла менеджер о своем изменении.
Но звучит как оверинжинеринг. Неуверен, что 1 легкий запрос раз в n минут в твоем случае — это проблема.
> Алсо я говорил о задачах которые таски в проекте (для управлениями которыми созданы basecamp/jira/trello)
Идея та же самая, но нужен интерфейс для определения состояния тасков. Если его нет, как вариант, подмешивать в таск модуль с методом status для работы с ad-hom айпи basecamp/jira/trello и и т.п. сервисами.
Это нужно решать в интерфейсе, а не на уровне базы данных. Если проверяется, то заблочить все изменения нах.
Ты даже не сказал, какая у тебя субд, но при этом спрашиваешь, как это сделать на уровне дб.
Есть апи контроллер, выдает на экшене json по get.
Пытаюсь это затестить рспеком. Рспек видит респонс.
expect(response.content_type).to eq('application/json')
Есть.
Но его тело пустое почему-то.
Как тут не получается https://gist.github.com/jayncoke/4a7c1a67fdc464ad66e8
body = JSON.parse(response.body) выдает []
Хотел затестить что конкретно приезжает такой json с полями или конкретно .to include_json
ЧТо я упускаю?!
На RubyMotion можно писать под Android. Шапка обновляется вообще?
Юзай что тебе удобно и всё.
Раньше он тормозил пиздец, да и юзали его в основном спермоблядки.
Я хочу сделать хрень, которая от рандомного объекта произвольного уровня вложенности достает все поля по определенному пути. Например
Account.(здесь произвольная вложенность).user_data.shops.orders.items.name
Мне нужно получить наименования всех товаров всех магазинов заказанных пользователем в плоском списке из любого места в иерархии.
То есть, я должен по пути, включающем в себя как массивы, так и вложенные документы, выдать от произвольного embedded документа список значений полей.
Используешь монго для описания реляционных отношений - страдай. Если при этом ты используешь embedded массивы и/или embedded сущности, которые описывают объект, связанный не только со своим родителем - ты дебил. Если у тебя еще и вложенность многоуровневая - ты просто космический дебил, извини.
Извини, эту хуйню не я придумывал, я тут человек маленький, и стиль нашей великой разработки "Лучшей команды в компании" мне оспаривать запрещено.
```
# config/initializers/my_lib.rb
MyLib.configure do |conf|
conf.val = 42
end
```
Делается это просто (и работает):
```
module MyLib
class << self
attr_accessor :configuration
end
def self.configure
self.configuration ||= Configuration.new
yield(configuration)
end
class Configuration
attr_accessor :val
end
end
```
Но проблема в том, что в development-окружении рельсы делают лайв-релоад кода. А после реалоада класса настройки, как можно догадаться пропадают, потому что сделаны были в инстанс-переменной в инициалайзере.
И не в этом даже проблема - рельсы не перезагружают класс, если он не менялся. А вот ебаный delayed_job перезагружает классы после каждого таска - https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/worker.rb#L321
У меня есть надежда, что есть какой-нибудь способ заставить настройки сохраняться/переинициализироваться. Ведь это распространенная практика и не видел чтобы кто-то жаловался на такие проблемы. Я читал сегодня что-то релевантное про функционал в railties, какие-то хуки там есть, но так и не разобрался, как это работает и применимо ли к этой задаче. Анон, что можно сделать?
```
# config/initializers/my_lib.rb
MyLib.configure do |conf|
conf.val = 42
end
```
Делается это просто (и работает):
```
module MyLib
class << self
attr_accessor :configuration
end
def self.configure
self.configuration ||= Configuration.new
yield(configuration)
end
class Configuration
attr_accessor :val
end
end
```
Но проблема в том, что в development-окружении рельсы делают лайв-релоад кода. А после реалоада класса настройки, как можно догадаться пропадают, потому что сделаны были в инстанс-переменной в инициалайзере.
И не в этом даже проблема - рельсы не перезагружают класс, если он не менялся. А вот ебаный delayed_job перезагружает классы после каждого таска - https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/worker.rb#L321
У меня есть надежда, что есть какой-нибудь способ заставить настройки сохраняться/переинициализироваться. Ведь это распространенная практика и не видел чтобы кто-то жаловался на такие проблемы. Я читал сегодня что-то релевантное про функционал в railties, какие-то хуки там есть, но так и не разобрался, как это работает и применимо ли к этой задаче. Анон, что можно сделать?
я не совсем понял зачем нужен class Configuration
Попробуй так: http://pastebin.com/71YjvLgb
и опиши юзкейс, когда ломается.
Посмотрел код delayed_job.
Есть такой метод:
```
def self.reload_app?
defined?(ActionDispatch::Reloader) && Rails.application.config.cache_classes == false
end
```
Из него вытекает два варианта :
1. выставить Rails.application.config.cache_classes = true, для development.rb в environments.
Тогда кэширование будет включено, как в production mode. Минус в том, что не будет работать hot code reload.
2. Прочитать документацию, по ActionDispatch::Reloader
http://api.rubyonrails.org/classes/ActionDispatch/Reloader.html#method-c-to_prepare
Там рассказывается о каллбеках: to_prepare, to_reload
которые вызываются перед вызовом Reloader. Обрати внимание, на контекст где вызываются каллбеки.
Зарегистрировав вызовы, можно сохранить и восстановить состояния библиотеки, немного костыльно, но для development mode сойдет, а hot code reload для остальной части проекта будет работать.
Вот тут можно почитать о решении похожей проблемы
http://stackoverflow.com/questions/8895103/how-can-i-keep-my-initializer-configuration-from-being-lost-in-development-mode
Посмотрел код delayed_job.
Есть такой метод:
```
def self.reload_app?
defined?(ActionDispatch::Reloader) && Rails.application.config.cache_classes == false
end
```
Из него вытекает два варианта :
1. выставить Rails.application.config.cache_classes = true, для development.rb в environments.
Тогда кэширование будет включено, как в production mode. Минус в том, что не будет работать hot code reload.
2. Прочитать документацию, по ActionDispatch::Reloader
http://api.rubyonrails.org/classes/ActionDispatch/Reloader.html#method-c-to_prepare
Там рассказывается о каллбеках: to_prepare, to_reload
которые вызываются перед вызовом Reloader. Обрати внимание, на контекст где вызываются каллбеки.
Зарегистрировав вызовы, можно сохранить и восстановить состояния библиотеки, немного костыльно, но для development mode сойдет, а hot code reload для остальной части проекта будет работать.
Вот тут можно почитать о решении похожей проблемы
http://stackoverflow.com/questions/8895103/how-can-i-keep-my-initializer-configuration-from-being-lost-in-development-mode
>>887393
Большое спасибо тебе, анон! to_prepare решило мою проблему.
Я вчера был очень близок к нему, но неправильно начал делать - пытался создать рейлти для своего класса
MyLib::Railtie < ::Rails::Railtie; def to_prepare ... end; end
Сделать переинициализацию таким образом не получилось.
Первый твой способ не заработал хотя я не понял в чем его суть.
> Первый твой способ не заработал хотя я не понял в чем его суть
Просто не понял зачем код переусложнять. Если предполагается, много конфигураций, то инстансы Config не надо создавать через синглтон модуля. Как вариант:
module MyLib
class Config
attr_accessor :var
def initialize(args)
yield self
@var ||= args[:var] || 17
end
end
def self.config
@config ||= MyLib::Config.new
end
def self.config=(other)
@config = other if other.kind_of? MyLib::Config
end
end
Тогда текущая конфигурация будет настроена, например, так
MyLib.config = MyLib::Config.new do |config|
config.var = 42
end
Или так
MyLib.config = MyLib::Config.new(:var => 5 )
Или так
MyLib.config
А как хранить все варианты конфигураций, это другой вопрос (если коротко: Hash внутри MyLib). Если вдруг решишь поиграться, то прости код писал вслепую, могут быть ошибки.
А первый вариант, это еще более простой вариант, так как я полагаю, что одного конфига хватит за глаза.
---
Ну а потом, я слепое, прочитал что ты на самом деле спрашивал и полез смотреть в рельсу…
> Первый твой способ не заработал хотя я не понял в чем его суть
Просто не понял зачем код переусложнять. Если предполагается, много конфигураций, то инстансы Config не надо создавать через синглтон модуля. Как вариант:
module MyLib
class Config
attr_accessor :var
def initialize(args)
yield self
@var ||= args[:var] || 17
end
end
def self.config
@config ||= MyLib::Config.new
end
def self.config=(other)
@config = other if other.kind_of? MyLib::Config
end
end
Тогда текущая конфигурация будет настроена, например, так
MyLib.config = MyLib::Config.new do |config|
config.var = 42
end
Или так
MyLib.config = MyLib::Config.new(:var => 5 )
Или так
MyLib.config
А как хранить все варианты конфигураций, это другой вопрос (если коротко: Hash внутри MyLib). Если вдруг решишь поиграться, то прости код писал вслепую, могут быть ошибки.
А первый вариант, это еще более простой вариант, так как я полагаю, что одного конфига хватит за глаза.
---
Ну а потом, я слепое, прочитал что ты на самом деле спрашивал и полез смотреть в рельсу…
Тут либо STI (как самое простое), либо полиморфная связь.
Сначала был whenever + cron, но чет неудобно crontab обновлять из апп.
Решил остановиться на sidekiq + sidetiq. Но последний оказался... каким-то конченным. Всем подходит (даже при факапе может "задним числом" выполнять и вебинтерфейс няшный), но вот, сука, выполняет задачу сразу после запуска, хотя она поставлена на опр. время. Как будто там собственный таймер и вообще хуй проссышь, че и как там. Issues дохуя и не мейнтейнится активно.
ОП предыдущих тредов
В периоде тупо даты начала и конца (периода).
В PeriodActivity активность юзера для данного периода.
Собственно, нужно сделать стату для юзеров для каждого периода.
Схема:
User has_many PeriodActivities
Period has_one PeriodActivity
норм?
> Тут либо STI (как самое простое)
Я что-то вообще не пойму как его тут использовать.
> либо полиморфная связь.
А вот это то что надо, похоже.
В гайдах у них pictures -> imageable_id, у меня item -> ?
Но ведь skinnable имеет смысл только когда связь с таблицой skins, а в другом случае получается вообще itemable ?
Недавно на него съебал, оче годно. Единственный минус - молодая экосистема, поэтому многое приходится писать самому, но так как комьюнити достаточно активное - то это временная проблема и уже не так ощутима, как, например, год назад.
Простите, за глупый вопрос.
Заранее хочу оговорить, что я еще на стадии изучения Ruby, RoR и метапрограмирование не изучено. html знаю но не 5.
php сам говорит, что сайт написан на нем, а в js все действия (Не только анимация.) выражены через оные скрипты.
Если что, то я смотрю, через просмотр кода браузера.
Спасибо.
чо за список?
покупать я ее конечно не буду, но прочитать - бы прочел
Есть "Электронная версия" на том же сайте издателя.
Если кто найден - закидайте линками.
http://www.piter.com/collection/new/product/ruby-obektno-orientirovannoe-proektirovanie
Съеби отсюда.
Валидации конечно должны быть в FO, иначе весь смысл проебывается, а смысл - не нагружать наследников ActiveRecord::Base всякой ебалой, которой там не место, это должен быть всего лишь маппинг к ряду в базе со скоупами и ассоциациями. По поводу того как быть has_many, прелесть FO как раз именно в том что ты что хочешь то и делаешь, код же экспликтный никаких колбэков и прочей хуеты. Попробуй создать свой форм объект без использования каких-либо гемов, чтобы понять суть, вот какой интерфейс сочтешь логичным и приятным такой и пили. Сорян если сумбурно
А виртус действительно раздутая магическая ебала, особенно неебический интерфейс коерций, который нахуй никому не сдался
class UserForm
include Virtus.model
include ActiveMode::Validations
attribute :email
validates_presence_of :email
attr_reader :user
def initialize(user = User.new)
@user = user
self.attributes = user.attributes
end
def submit(params)
self.attributes = params
return unless valid?
user.update!(attributes)
# Можно еще какую нибудь хуйню сделать с пользователем
# И никаких говноедских колбэков
end
end
# Создать, например
form = UserForm.new
if form.submit(params)
# Все ок, можно юзать form.user
else
# Ошибки валидации, можно юзать form.errors
end
class UserForm
include Virtus.model
include ActiveMode::Validations
attribute :email
validates_presence_of :email
attr_reader :user
def initialize(user = User.new)
@user = user
self.attributes = user.attributes
end
def submit(params)
self.attributes = params
return unless valid?
user.update!(attributes)
# Можно еще какую нибудь хуйню сделать с пользователем
# И никаких говноедских колбэков
end
end
# Создать, например
form = UserForm.new
if form.submit(params)
# Все ок, можно юзать form.user
else
# Ошибки валидации, можно юзать form.errors
end
В разметку не умею, сорян
Как их не дергать на каждый экшн из базы? Это, как я понимаю, не оче хорошая практика.
Кешировать это все? Это нужно in-memory базу или че? Built-in решения есть?
Built-in решения есть?
Да, есть http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-memorystore и потом >>895931
так все это дерьмо фоновыми демонами же всегда крутится в системе (как именно - зависит от конкретной ос)
Спасибо.
Пару вопрос, если можно:
- Зачем там Virtus?
- Почему объекты передаются в инициалайзере, а параметры в сабмите. Почему не наоборот? Просто если наоборот, то форму можно использовать как `form.valid?`, а так можно использовать только `form.submit(params)`.
- Что на счет практики сохранения в FormObject - стоит ли ее там держать или лучше уносить в ServiceObject?
- Можно без виртуса, но с ним удобнее (есть более приятные альтернативы, гугли)
- И там и там нужно. Представь что у тебя модель с дефолтом, при инициализации этот дефолт должен быть в атрибуте форм объекта, при этом сабмит - это отдельная операция сохранения, переданный параметр должен опять записаться в атрибут
- Нет никаких форм объектов или сервисных объектов, эти ограничения и рамки ни к чему, есть просто plain old ruby objects, где и как считаешь нужным так и сохраняй
1. Просто в примере он не используется. Как раз сейчас читал про dry-types упомянутый выше. И чет прихуел от их dry-проектов.
2. Э нет. Форма - работает с формой мне больше нравится слово input. Если есть дефолты, то они на ней и должны быть определены. А сабмит да, операция сохранения (которой в некоторых реализациях может не быть) и объекты нужны только ей. До момента сохранения мы абстрагируемся от хранилища.
3. Ну речь же про паттерны. Вот форм-обжект это недообъясненная вещь. Возможно даже недопаттерн. Я так понял, что это composition-pattern, но обросший особенностями конкретного применения в рельсах. Я для себя понял это так: форм-обжект про композицию и валидацию, сервис-обжект про процесс. В простых случаях, когда нужна только персистенция, мы можем процесс сохранения добавить в форм-обжект. Если процесс чуть более сложен , то его стоит уносить в другое место.
Не спора ради, а понимания для, анончик.
foreman/docker. Докер моднее и в последствие удобнее, если у тебя будет большая команда, форман намного проще настроить.
1) В примере используется, смотри attribute
2) В твоих словах есть смысл, а теперь представь что эта же форма используется для апдейта и ты закидываешь туда готового юзера например. Атрибуты должны подхватиться для отображения ДО того как ты вызвал submit, потому что какой нахрен сабмит, еще ничего не показывали
3) Я бы рассказал что паттерны не нужны, но закидают помидорами, поэтому попробую ответить на твой оригинальный вопрос: если бы атрибуты сохраненного объекта приходили из юзер инпута, я бы сохранял в форм обджекте, если из моей же системы и мне не нужно ничего валидировать то в сервис обджекте
> 2017
> Докер
> Ебаться с орекстрированием, пробросом портов, персистенцей
Расслабься хипстерок, все уже забили на твой докер, мода прошла, можно больше не вставлять везде
>Атрибуты должны подхватиться для отображения ДО того как ты вызвал submit
Бля, вот я пиздоглазый, ты прав.
Благодарю за разъяснения, анон.
>пробросом портов
одна строчка в docker-compose
>персистенцей
пол строчки volumes
>орекстрированием
значение знаешь?
>Расслабься ку-ка-ре-ку!
Так бы сразу сказал что нюфаг и не осилил. Но лучше подразберись, а то скоро без знания докера вакансий не останется, только пхп-параши драить разве что.
> docker compose
> одна строчка
Блог деплоил, девопс мамин?
Уже давно все поняли что докер это параша https://news.ycombinator.com/item?id=12872304
Кароче есть СИнатра, пытаюсь добавить webshim-polyfiller
как тут написано добавляю в layout.haml
%script(src='/javascripts/js-websim/minified/polyfiller.js' type='text/javascript')
хотя type вроде и не обязателен
javascripts ложу в public.
Получаю "NetworkError: 404 Not Found - http://localhost:9292/javascripts/js-websim/minified/polyfiller.js"
ФФ еще говорит
The resource from “http://localhost:9292/javascripts/js-websim/minified/polyfiller.js” was blocked due to MIME type mismatch (X-Content-Type-Options: nosniff).
Если просто ложу в корень javascripts скрипт файл - не ругается.
ЧЯДНТ?
Если тебе нужно понять поверхностно код на руби, то подойдет. Если хочешь начать писать на нем как можно быстрее, минуя подводные камни, то не подойдет.
1. Как реализовать инвайты? Я хочу чтобы пользователи могли регаться и по почте и через вконтакт, как им удобнее. Гем devise_invitable как я понял работает только с почтой, поэтому я запилил свой велосипед. Пользователь жмёт кнопку и создаёт ссылку с инвайт-кодом вида site.ru/register?invite_id=<UUID> (код - это просто UUID). Код сохраняется в БД. Потом передаёт ссылку любым способом своему другу, тот переходит по ссылке, RegistrationsController проверяет код и разрешает другу зарегистрироваться. Регистрация обычная, через devise. В будущем я добавлю разные виды инвайтов для админов и простых пользователей, сделаю ограничение срока годности и количества создаваемых инвайтов. Это норм способ? Есть варианты получше?
2. Как правильно запускать сайт в продакшен, если регистрация только по инвайтам? Сейчас я создаю аккаунт суперадмина с максимальными правами через seeds.rb, логин/пароль храню в ENV. Потом приглашаю обычных админов и больше не пользуюсь этим аккаунтом. Это норм способ? Как поступают взрослые дяди в таких случаях?
А что подойдёт? Чтобы без всяких очевидных вещей, а-ля "класс это то-то, объект это то-то"
Если для тебя это очевидно, то ты не будешь долго задерживаться на этом момементе, так что я считаю, что ты можешь пройтись по рекомендованному списку.
Также советую эту книжку https://pragprog.com/book/adrpo/ruby-performance-optimization
Пока мне за него деньги платят - не мертвый
Imagemagick отказывается читать файлы.
Нужно что бы пользователь загружал изображения, а потом могу их простейшим образом редактировать. Редактирование работало бы если бы не одно но - сейчас rmagick (как и minimagick) выдаёт ошибку -couldn't find file or directory. То, что файлы есть в нужной папке 100%, не работают как абсолютные, так и относительные пути. И браузер тоже открывает эти файлы. Что это может быть?
Да, но на сервере та же беда.
Английский учи сначала, потом погромирование
Чет херню какую-то пишешь. Нахрена тут STI? Зачем усложняешь? Товары, категории, джоин таблица. Все
Ну так допустим у меня есть набор носков (который относится к отдельной модели наборов), я не хочу чтобы к этому набору можно было добавить трусы ( а если будет простая ассоциация товары <>наборы то это можно будет сделать)
такая задача решается на уровне приложения а не базы, просто храни в наборе разрешенные категории и не разрешай добавлять товары из других категорий
Вопрос: можно ли с его помощью создать сервер, видимый из интернета?
И если да, как ему отправить сообщение? (Можно ли отправить, используя telnet?)
Т.е. надо сделать валидацию ассоциаций ?
Опять же не пойму как это сделать validate :method_name вызывается только при сохранении , а если устанавливать связь через = или << этот метод не будет вызван.
Тебе нужно, чтобы твой компьютер был доступен из ынтернета. Разбирайся с провайдером, короч. А так разницы нет.
Забудь про колбэки и валидации в моделях, ни один приличный рубист в 2017 таким заниматься не будет, пили форм объект в котором экспликтно все и провалидируешь
Охуеть, а если у меня эти ассоциации устанавливаются не через форму в веб интерфейсе?
Форм объект это не про веб формы, гугли
Хорошая штука, но слишком поздно появилась. В 2017 году, если уж отказываться от инфраструктуры рельсы, то проще сразу эликсир с фениксом взять.
Все велосипеды уже изобретены. Вот наш:
https://github.com/openbill-service
Смотри, пользуйся.
Рельсы справляются с задачами, решения которых от них ждут, а на дешевые вбросы вроде твоего здесь еще не было реакции более активной чем этот мой ответ.
Все адекватные уже давно понимают, что рельсы мертвы, даже по рынку вакансий это можно взглянуть и понять, ибо их все меньше и меньше с каждым годом. Да и все крутые компании уже ушли с рельс на что нибудь типа ноды или низкоуровневое.
Другое дело, что программисты на руби все еще имеют смысл, так как кода написано куча и кто то его поддерживать должен.
>Node
Это шутки такие? Туда до сих пор нормальную работу с базой не завезли, в 2017-то! Не знаю какие хипсторы в это играются, ни одного здравого проекта на ноде я ещё не видел за 6 лет.
Это типичный вопрос нодофага? Да хотя бы транзакции, например. Может я чего-то не знаю, и за этот год действительно кто-то там скакнул вперёд, но чет не слышал.
>>906820
Поясни.
Так у вас там на pgsql все, ладно попытаюсь понять.
Это типичный ответ от рельсофага? В npm куча модулей для транзакций. Давай на конкретном примере, что в рельсах лучше чем в ноде или чего в ноде нет, что есть в рельсах.
>В npm куча модулей
И все работают через жопу. Конкретный пример с транзакциями: чтобы воспользоваться транзакциями - поставьте вот этот модуль.. или вот этот, или вон тот. Нахер так жить? Одной ORM недостаточно для этого? Для чего ещё нужно поставить модули, что и так должно работать искаропки? Удобства в ноде нет, зато есть ненужная асинхронность, которую тоже надо отдельно выключать.
Что-то вроде "используй ту же базу данных, что и деофл"
например, если у тебя в дефолте постгре, то остальные тоже будут с постгре
Да, еще там кодировку ту же использовать и еще какое-то свойство (рооl, как понял - ставит максимум для тредов)
http://docs.sequelizejs.com/en/v3/
Вот же, первая ссылка в гугле. Не знаю, о чем с тобой говорить, если ты не можешь 2 секунды потратить, прежде чем начать нести чушь.
да
Ну молодец, подебил. Удобнее разрабатывать от этого не стало.
Веб-сервер и рельсы конструктивно находятся в одном приложении?
Или это два процесса, общающихся между собой? (еще +бд)
И еще. Веб-сервер нужен лишь затем, чтобы ловить запросы из внешней сети? То есть это просто посредник между рельсами и юзером? Веб-сервер просто передаёт HTTP без изменений маршрутизатору рельс или как?
>Веб-сервер и рельсы конструктивно находятся в одном приложении?
Это одна программа.
>Или это два процесса, общающихся между собой? (еще +бд)
Обычно БД это как раз отдельная программа(postgresql/mysql/oracle). Хотя можно сделать на sqlite который будет встроен в виде gem'а в процесс рельс (руби который всё это загружает). Но конкретно рельсы это одна программа которая принимает HTTP-запросы (собственно это и есть веб-сервер) сидя на каком либо порту.
Однако для распределения нагрузки, безопасности или другим причинам рельсы часто ставят за прокси типа nginx.
> Веб-сервер и рельсы конструктивно находятся в одном приложении?
Конструктивно, есть выбор между разными веб-серверами, выполнив достаточно простые (скажем https://devcenter.heroku.com/articles/rails-unicorn) можешь поменять дефолтный.
При этом на одном веб-сервере может крутится несколько rails приложений. Одно из крупных обновлений 5 рельсы, когда осуществили переход с single-thread веб-сервера webrick на пуму бтв.
Ассоцировать рельсу и web-сервер как неделимую сущность не нужно, так как на той же пуме ты можешь (запустить веб-приложение, написанное на другом фреймворке, скажем, на синатре.
В тонкости различий веб-серверов можешь вникнуть погуглив по ключевым словам: webrick, puma, unicorn, passenger, у меня если честно нет желания пересскажывать этот интернет, спасибо.
Они не умерли, а умирают. Причем только в начальных стадиях отмирания, даже новые проекты на руби/рельсах еще начинают, а уж легаси хватит на многие годы. Минимум лет 5 еще можно о недостатке работы не беспокоиться.
Я бы на твоем месте лучше побеспокоился о том, что через пару месяцев заканчиваю универ и все еще не нашел (не искал?) работу.
Так и вижу, как ты 24/7 диплом ботаешь. Я вот себе преддипломную практику нарисовал, а сам в это время нашел работу и к моменту написания диплома у меня уже было по чему писать, хоть и тема выдалась смехотворной, но многие и этого не осилили.
Если ты про continuation ident то это перенос длинных строк(и в erb/html он походу вообще не работает)
в таком случае у тебя локальная проблема; попробуй обновить ide на 2016.3 версию, у меня соотв. значение в поле indent расставляет отступы правильно.
2016.3.1 стоит
Весной поздно, пока туда-сюда - уже диплом писать надо будет. Рекомендую с февраля или вообще сейчас. Не надо искать "практику", просто ищи работу, а там уже себе бумажку вырулишь, типа практику прошел.
Вот он - ерохин от программирования!
"можно", "что-то подобное", "не лучшее решение".
Что ты блять несешь, хуесос? Иди активными продажами занимайся, там любят такие разглагольствования.
relation.merge(other_relation)
Не понимат, что смешного во второй картинке ОПа. Ну пакетный менеджер и что?
composer install
brew install
npm install
Мама смотри, я петросян
Найс дауничу подпекло. Еще и какел небось, да?
Короче не знаю как продать пост, просто поясните за сракедин. Насколько он популярен в it-среде, имеет ли смысл в рашке, что это вообще и как работает? Просто все чаще попадается на глаза и не в связи с блокировкой.
> Насколько он популярен в it-среде
Меня там регистрироваться заставляли как-то в добровольно-принудительном порядке, но через полгода примерно положили болт. Эта штука больше популярна в околоменеджерских кругах наверно.
смысл был несколько лет назад, сейчас сдохла и заспамлена
В Rails API написано что это метод.
Это код внутри класса или что?
Это значит что в момент загрузки кода этого класса будет вызван метод ApplicationCable::Connection.identified_by(:user)
И больше ничего в этом магического нет.
У вас тут кстати самый ламповый тредик на зекаче
От джавы блевать хочется(особенно после рубей) а котлин мало кто юзает, там хоть кучу сахарком посыпали
Еще у меня такое чувство что в андроид сейчас каждый 1 школьник идет, куча знакомых дрочит, бывших одногруппников, в pr треды активные и там 90% вкатывальщиков. Мне кажеться от такого предложения работодатели совсем охуевшие будут.
Стоит. Джуна хуй возьмут везде.
С Руби сложно устроиться имея из опыта только учебники и простые приложения(бложики, тудулисты, клоны твиттера и ну ты понил). При этом Руби в большей мере предрасполагает к тому, чтобы ты получил нужный опыт без работы в конторке. Сделать интересное приложение или вложиться в опенсорс на Руби определенно проще, чем где-либо еще.
Руби в 2017 лучше и живее чем раньше.
А можешь накидать каких годных идей уровня: с чем возьмут? Только не ебучие имиджборды
Бля, я сам думал неспешно кодить в удовольствие, наваять пару веб-апп(идеи есть, но это месяца на 3-4 минимум) и поизучать сорцы разных интересных гемов, но сейчас настал пиздец в жизни и у меня максимум 2 месяца чтобы пойти на работу и не сдохнуть через пол года от голода, но в джавапарашу мне все равно очень не хочется валить
>в джавапарашу мне все равно очень не хочется валить
Джава отличный язык с кучей отличных технологий и людей вокруг, зря ты так. Да и JRuby во многих случаях лучше простого Руби.
>А можешь накидать каких годных идей уровня: с чем возьмут? Только не ебучие имиджборды
Слово "накидать" трудно применить в отношении чего-то годного. Конкретно действительно не могу сказать, индивидуально же все. Самих по себе годных идей нет, бывает только годная реализация. Я бы выделил как критерии: пользуешься ли ты сам тем, что сделал, пользуются ли другие и многие ли могут так же. Если в один из них попал, то это гораздо лучше типовых гостевух. Если интересные идеи в голову не приходят, то можно взять первое, что пришло в голову и сделать это с нетипичным стеком технологий. Главное движение, на волшебные идеи надеяться бесполезно.
Просто не будет, но ты не выглядишь как неосилятор. Должен справиться.
А вот это уже хуй его. Попросту говоря в момент когда ты скармливаешь интерпретатору файл с кодом. Или когда внутри другого кода реквайришь зависимость. Короче гугли как рубишный интерпретатор работает.
>пользуешься ли ты сам тем, что сделал, пользуются ли другие и многие ли могут так же
Первые два сразу мимо т.к. я сыч и в инете сижу на 2-3 сайтах(youtube, двач и вк), не считая сайтов с доками, репозиториями и туторами и переполнениестека, мне от интернета нихуя не надо. А чтобы пользовались другие,даже с божественной и всем нужной прогой, должно пройти время и надо хотябы минимально пиарить на всех этих харбах редитах, конфах и т.д. Остается только третье. С другой стороны меня блевать тянет от мысли реализовать что-то, чего и так, как говна в авгиевой конюшне, все эти туду листы, имиджборды, блоги. Ну хз сейчас начну на листик выписывать все что приходит в голову подряд, комбинировать и думать что из этого можно выбрать для реализации. Но надеюсь двач тоже подкинет каких-нибудь идей или направлений.
Кстати, ебашить буду на rails + react + postgre + yaml/препроцессоры и джаваскрипты , это норм стек, смузи нальют? Для скриптов что лучше брать, кофевара или es6 какой-нибудь?
>Первые два сразу мимо т.к. я сыч и в инете сижу на 2-3 сайтах
Даже к этому можно подойти с фантазией. Кто-то, например, Перекотер для двачей сделал. Хорошая предметно-ориентированная штука. Автоматизировать можно очень многие повседневные задачи. Хоть таск-менеджер в области ухода за домашними моллюсками, имеющий вменяемый интерфейс и посылающий уведомления в телеграмм когда нужно помыть террариум. Смотри на мир шире двача и вк.
>пиарить на всех этих харбах редитах, конфах и т.д.
Пиарить нужно то, что само по себе никому не нужно. Что-то интересное разойдется мгновенно. Да и нужно ли тебе, чтобы разошлось? Для портфолио и опыта будет отлично, даже если твоим микросервисом просто по вечерам будет пользоваться твоя мама. Я серьезно.
>Кстати, ебашить буду на rails + react + postgre + yaml/препроцессоры и джаваскрипты , это норм стек, смузи нальют?
Нассать в уши эйчарам - норм, они эти слова не понимают, но любят. Еще про тесты в список что-нибудь добавить и резюме готов. По факту ты вряд ли будешь знать больше чего-то одного на нужном уровне, так что по делу будет важнее и полезнее разобраться во всей архитектуре веб-приложений. Для начала нужно врубиться как это все работает и соединяется между собой начиная с низа. Что происходит на уровне ОС, сетИ, какие объекты-методы-модули что-куда вызывают и зачем. Можно насмотреться курсов по реакту и ес6, которых теперь тысячи из-за трендовости, но не улавливать самые базовые механизмы. Если время поджимает, то лучше просто очень хорошо понять сам язык, рельсы и полезные гемы, на реакте за тебя кто-то наверняка напишет, тебе важнее это быстро и правильно интегрировать в бэкэнд.
>Для скриптов что лучше брать, кофевара или es6 какой-нибудь?
Если ты имеешь в виду кофескрипт, то не трать на него время. Он больше не актуален. JS стоит опять же хорошо понять в чистом виде и если будет время то es6 и утилиты для сборки на ноде.
Для автоматизации тестирования связка руби/капибара/гем на page object актуальна, или эта ниша тоже загнулась к хуям?
Руби вообще жив?
>Руби вообще жив?
Такой вопрос звучит очень часто, но только на русском языке. Есть несколько знакомых, которые спрашивали о том же будучи в целом далекими от мира веба. Оказалось, все их знания о Руби это несколько антирельсовых статей с хабра. Полагаю, сказывается природная восприимчивость русского менталитета без малейшей обработки складывать к себе в голову любую информацию из СМИ, насильно хоронить и страстно превозносить что-то, если кто-то так сказал.
>На девелопера руби / рельсы есть работа вообще?
Есть, много.
>Для автоматизации тестирования связка руби/капибара/гем на page object актуальна, или эта ниша тоже загнулась к хуям?
Актуальна, но нишей это не никогда не называлось.
Поясню. Я тестировщик.
Года три назад щупал руби когда только вкатывался в автоматизацию, но по итогу меня взяли на проект с имеющейся базой, и пришлось осваивать жабу.
Сейчас меня малёх подзаебала жизнь, и я пошёл искать другой участи на галере. Пока фронт работ ограничивается ручной работой (хотя весьма интересной) пушто я один на проекте, а новые фичи выкатывают со скоростью света, тут бы новое тестить успевать. Но уже в ближайшем будущем появится пару макак рангом пониже, которым на откуп можно будет отдать новоиспекаемое говно, а самому заавтоматить функциональщину. И тут мне вспоминаются зелёные дни, и каким удивительно простым и логичным казался руби, но...
Чёт не хочется угробить время на разбор чего-то, что не апдейтится N лет, с мёртвым сообществом и логикой через жопу, а именно на это намекают вот такие вот самоплодящиеся слухи вроде того, что ты привёл.
Собсна, хотелось бы узнал реальное положение дел.
Самые сильные места и сама идея Руби в том, что его логика максимально удалена от жопы, а коммьюнити одно из самых сильных, пусть и не больших. Его слабое место в другом и прямо следует из вышесказанного: у него медленный интерпретатор и громоздкая архитектура(с точки зрения машины). Может быть даже самый медленный.
ПейПэл перешли с рельс на ноду не потому что Руби умер, а потому что кто-то схавал "актуальную" технологию не подумав, что для высоких нагрузок она решительно не подходит.
Первое, что делают начинающие рубисты когда собирают свой клон твиттера -- пишут тесты. Для тестов он подходит лучше чем что-то еще, если скорость не критична.
А какие для твоих целей есть альтернативы?
Альтернатива — жмуметр, пресловутый селениум и джава. Потому что это почти всё, что я умею.
Интересный вопрос, на который очередной фелосаф-рубисектант ответит "да".
Но ирл, можно сказать на 100% - руби (именно руби) - это мертворождённый язык. Он слишком сложен для решения любой нетривиальной задачи, содержит слишком много синтаксического сахара, и главное - в нём нет ничего феноменально нового.
Рельсы - это хороший фреймворк, который таки родился, но к сожалению умер. Всё дело в несоответствии концепций и целей. Либерахи и хипстерьё отчаянно пиарили этот рор везде, где только можно - предполагая, что он найдёт свою нищу в больших и сурьёзных тырпрайз-приложениях, конкурируя с громоздкими жабами и шарпами.
Но опять же - принципиально новых концепций не вышло, так что слишком сурьёзные и суровые тырпрайз-боссы не рискнули давать бабла на переписывание.
Так рельсы стали конкурентом пхп - где бодро соснули хуец, ибо пхп-макакинг сильно ниже по рейтам, и на слуху у заказчиков - а пхп тырпрайз, опять же, не рискнул.
Работы по руби нет - а если и есть, то "знание пхп", чтобы в один момент смог перепилить своё говно на него.
Директор, у нас компания небольшая. Он когда в силиконовую долину летал наш стартап представлять, говорил что на эту хрень будут смотреть. Но раз все на него (всмысле на линкедин) сейчас болт положили, значит не особо то и нужен. Если есть какие скиллы - регайся, но так наверно всем похуй. Больше репозиторий важен и владение какими-нибудь современными йобами.
>Больше репозиторий важен и владение какими-нибудь современными йобами.
Но это ведь не про профиль в сети сам по себе. СрекедИн он же про коммуникацию. Лично мне очень понравилась идея "перманентного поиска" работы. Ты там присутствуешь, и потенциальный работодатель или партнер может найти тебя в любой момент, а не тогда, когда тебе приспичило и пошел размещать резюме на хедхантере.
Это очень здорово (если это работает), потому что смена места работы всегда вынужденная и всегда компромисс и стресс. Охуенно, если действительно работа сможет сама меня находить, а не я ее что было бы справделиво.
Вот только не знаю, насколько это работает у нас в стране.
В оф гайде пишут про какой-то аддон для редиса, я так понял его надо КУПИТЬ
https://blog.heroku.com/real_time_rails_implementing_websockets_in_rails_5_with_action_cable#step-2-provision-the-redis-to-go-addon
Тогда это скорее всего вопрос скорости против архитектуры. На Руби это можно сделать архитектурно красивее, хотя это и по-своему субъективно. Если ты испытываешь к нему некую симпатию и предрасположенность, то смело бери его. Он не умер и жив не меньше, чем раньше. Другое дело, что его плюсы при строго техническом сравнении мягко говоря не очевидны.
>>912963
>Он слишком сложен для решения любой нетривиальной задачи
Чем сложен?
> содержит слишком много синтаксического сахара
А сколько должно быть, где по-твоему граница?
> в нём нет ничего феноменально нового.
А в чем есть?
>Всё дело в несоответствии концепций и целей
>свою нищу в больших и сурьёзных тырпрайз-приложениях, конкурируя с громоздкими жабами и шарпами.
Тырпрайз это всегда основательный подход к проектированию, строгие спецификации еще до начала разработки и высокие нагрузки. Масштабирование вертикальное, а не горизонтальное. Только идиот может считать, что Руби когда-то на это претендовал.
>Так рельсы стали конкурентом пхп
К этому момента стало очевидно, насколько твое виденье вопроса далеко от реальности. На Руби кто-то пытался сделать Вордпресс или Битрикс?
У Руби своя ниша, которая даже близко не пересекается с пхп или шарпами. Это ниша, которую принято ассоциировать со стартапами. Горизонтальное масштабирование, быстрая и гибкая разработка. И то, что многие проекты с Руби потом переписываются это не оскорбление в его сторону и знак, что он умер. Это инструмент, который отлично справляется с тем, для чего он предназначен.
>И то, что многие проекты с Руби потом переписываются это не оскорбление в его сторону и знак, что он умер.
А кто это делает вообще? Твиттер и гитхаб? Их по пальцам пересчитать. В основном никто ничего не переписывает, потому что, как правило, нет таких нагрузок, чтобы это было целесообразным.
Спасибо, просто карту просил привязать, побоялся.
authenticated :user do
root 'welcome#index', as: 'authenticated_root'
end
это в 5 рельсах не работает
гем devise конечно же
я сделал специальный контроллер для root_path, пусть будет welcome контроллер. В нем определен метод index. соответственно, зайдя на домашнюю страницу, редирект идет на welcome#index
НО, если юзер логинится со страницы users/sign_in , то его должно редиректить на другой на друго контроллерб допустим, documents#index
Проходил самый свежий перевод Хартла около полугода назад уточнить версию лень и там был таки Rspec.
>Во-вторых, конкретно разработка через тестировку сейчас сдает позиции. Есть много спекуляций, что это хуйня.
Ну не знаю, с одной стороны действительно не очень удобно сразу думать над тестами, но с другой это позволяет тестировать без лишних ручных манипуляций. Для себя я нашёл оптимальный вариант: пишу небольшой кусок кода, когда приходит время проверить как это работает - покрываю его тестом вместо того, чтобы тыкать вручную. Если happy path проходит, проверяю всё живьём. Потом уже добавляю всякие корнеркейсы и unhappy path. А вы как делаете, анонасы?
Да не за что. Не забывай, что впереди тебя ждет хардкорный путь и у тебя есть свой шанс облажаться со сроками. Задача все-таки вполне амбициозная. Желаю успехов, заходи еще, спрашивай.
Все Рубисты быстро смиряются с отсутствием литературы на русском и осваивают английский, а после этого уже точно не возвращаются на хабр и куда-нибудь в руби-паблики-вк. Работают вообще поголовно удаленно и укатываются сидеть с макбуками на Гавайи. Никаких тебе митапов и воркшопов в коворкингах. Отсюда и впечатление скудности коммьюнити: книжек нет, людей нет, упоминаний нет - еще и тренды пошли совершенно в другую сторону. хороним ООП, дрочим на ФП
Меж тем подошли свежие цифры о реальном положении дел. https://infinum.co/the-capsized-eight/analyzing-rubygems-stats-v2016
Не то что бы это большой повод для восторга, но по крайней мере сомневающиеся будут чувствовать себя спокойнее. А хабрапидоры останутся хабрапидорами.
Дико двачую. 7 лет на рельсе, раньше сильно лучше было.
Вообще руби без рельсы практически нигде не нужен. Рэйлс стал умирать после 13 года, с активным пиаром нод-макакинга на бэк/фронт-енде за еду и скорость выполнения. Параллельно большое число любителей с рубигайдом в хиленьких ручонках влилось на рынок, сильно обваливая прайсы и создавая очень плохую репутация фрейморку путем написания чудовищного кода и, следовательно, отправлением очередного говностартапа на помойку ит. Инвесторы просекли и продолжают сечь фишку и деньги на такие проекты дают все реже и реже.
> Работают вообще поголовно удаленно и укатываются сидеть с макбуками на Гавайи.
Взоржал с зазывалы. Ну-ка, пруфани видами, лол. Типичный держатель подвальной галеры с прыщавыми студнями "воспитывает" подрастающее поколение в пр.
Разумный баланс между кэшем и интересной работой(читай, хотябы не унылой шаблониной, которую спустя пару месяцев делаешь с закрытыми глазами)
Я на самом деле хз насчет го, но на двачах его форсяк как езык макак, этакая нода от империи зла гуглей
Работы интересной не бывает. Чтобы решать сложные задачи, нужно много учиться и практиковаться, где-то здесь со временем интерес пропадает. Ты проиграл.
>>914240
Писать на руби, жить с мамкой.
Голанг не плох, лучшее из лимбо без костылей си. Но в рашке и аутсорсе не приживется, потому что не веб. А это значит мало заказов и значит галерам нет смысла набирать гребцов.
Ну, я например не на Гавайях только потому, что нафиг не упало. Мне не 20 лет, чтобы тратить бабки направо-налево. А так все успешные пацаны теперь, кто со мной начинал.
Я тебя услышал.
Я понял, что не отказ. Просто интересно - как писать, если сначала ты хуяришь код без разбору от и до (хуже всего если проверяешь вручную при этом), потом полностью пытаешься написать на это всё тесты, потом они фейлятся, и ты долго и нудно расставляешь везде точки останова, шаришь по переменным, вот это всё, да? Потом находишь какую-нибудь, не относящуюся к конкретному тесту, ошибку, потому что пока хуярил - всё усложнилось и ты потерял из вида какую-то деталь. Мне кажется, если не всё напропалую за раз тестить, а помаленьку - на дебаг времени меньше тратится. Хотя возможно для кого-то медленным окажется прыгать туда-сюда из тестов в код и обратно.
Тебе бы начать в шеколадный глаз давать и фалафель сосать. Глядишь и тесты пройдут и кофаундер приголубит.
(Автор этого поста был предупрежден.)
Есть одна вакансия:
Требования: Уверенное знание: Ruby; Знание основ работы и разработки современных web-приложений (фоновые задачи, очереди сообщений, API); Понимание механизмов работы реляционных и noSQL БД (структура, нормализация, объединение, индексы); Знание: Ruby on Rails, PostgreSQL, CoffeScript, Sidekiq, Linux, Git Знание принципов Unit-тестирования и умение писать тесты с использованием rspec; Знание Unix на уровне пользователя командной строки Будет плюсом: Опыт работы с: Angular, Backbone, React Node JS; Знание алгоритмов и структур данных; TDD, TBD Знание других языков программирования.
И есть я - пару бложиков и реддитов на руби, с кодекадеми и прочим говном. Без опыта работы. Вопрос: Насколько велик шанс, что я соснул?
100%
И кто тебя обижает?
Почти наверняка, но попытка не пытка. Игнорируй запрос резюме, оно сразу улетит на помойку повышая при этом показатели эйчарщицы вчерашней выпускницы провинциального вуза. Вместо этого надо найти все телефоны, звонить и запрашивать тестовое задание и по возможности разговор с кем-то из технического отдела.
В компилированном js разобраться невозможно, но такое чувство, что там не хватает куска кода. Или от чего это может быть? В cable.yml вместо редиса поставил везде async.
Я бы попробовал отключить часть модулей компиляции до минимальной читаемости и попытался проследить до дыры в коде. Какая там в целом компиляция? Склейка в один файл и аглифай? Если так, то соответственно аглифай убрать и смотреть что получится.
Поделись потом, что получилось. Самому до сих пор с ЭкшнКейблом не приходилось иметь дела, но обязательно нужно освоить, 2к17 же. Какие вообще ощущения от работы с ним?
Я юный вкатывальщик, это (рор) мой первый фреймворк, так что думаю тебе не интересны мои ощущения. (А вообще всё очень просто, как и всё остальное в рельсах)
Действительно, углифаер проебывает куда-то кусок кода, ответственный за подписку, но пока я не могу включить углифаер обратно, лол. Вроде удаляю ассеты, компилирую снова, а в браузере всё так же. Походу у браузера в кеше остались, как у него их почистить?
Мозилла. Кеш удалил, проблема не в нем, руками проверил файл в public/assets -- почему-то не прикручивается углифаер обратно. Вроде как я только одну строку менял в production.rb.
Тут опять таки трудно что-то насоветовать не зная всей последовательности действий и остального контекста. Разве что напомню, трудно сделать большее что всегда можно откатить все изменения в гите и повторить все шаги более внимательно и осознанно. Я в половине случаев именно так нахожу выход.
Алсо, в первом случае ВНЕЗАПНО заработал акшон кабель. Вообще ничего не понимаю.
>>914495
Пожалуй, и правда, сделаю как ты советуешь.
Поддвачну т.к. у самого такой же пашпорт
Мне вот довелось, стрёмные ощущения. Всё равно это чисто "чтобы была". После эликсира особенно заметна разница.
Вот да, слышал похожие отзывы и что рельсо-звезды из Злых Марсиан именно поэтому сделали свой AnyCable как более человеческую альтернативу.
При всем моем Руби-оптимизме не могу не отметить, что сами Рельсы не очень хорошо адаптируются к современной разработке. Минитест - меняем на Рспек, Экшнкейбл - на Эникейбл, Спрокетс под нужны современного JS без Вебпака не подстраивается, Кофескрипт тоже отдельная история. И что удивительно, коммьюнити под все это так быстро и ловко подстраивается, что не успеваешь ощутить дискомфорта от неудачных решений DHH.
Двачну пожалуй. И скорей всего мне ещё предстоит перелезать на AnyCable.
Да вот биллинг вбрасывал недавно, для него вебхук-оповещатор запилил:
https://github.com/openbill-service/openbill-webhooks
Работает вроде по сей день.
Книжку лучше почитай по нему. На руби он похож только буковками.
Особенно интересно мнение этого >>913136
анона
В в общем делаю веб-парсер сайта, всё шло гладко, пока я не наткнулся на выпадающий список..
Как спарсить названия из списка, и ссылки на картинки, соответствующие выбору?
(curb/nokogiri/xpath)
http://www.sammccauley.com/Product/loreal-colour-riche-lipliner/27631/2224.14.0 к примеру эта страничка
Анончик, хелпани чем сможешь, вопрос жизни
https://toster.ru/q/391272
Создал тему на тостере, дабы не засорять харкач множеством букоф
Есть такой тест:
http://pastebin.com/APJC3Qib
Есть следующие моменты:
1)FactoryGirl все создает в дб, я провеляб byebug'ом
2)Эта сраница налокалке все рендерит, то есть присутствуют все нужные атрибуты, в том числе и name
3) Тест выдает ошибки, причем и в случаем с просты RSpec'om, так и с shoulda-matchers версией
ошибки/контроллер/страница пикрелейтед
Это копия, сохраненная 5 марта 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.