• Как настроить пенераправление субдомена на другой сервер?

    @vsuhachev
    есть следующие варианты:
    1. прописать в DNS для subdomain.clientwebsite.ru ip-адрес вашего сервера
    2. настроить прокси с clientwebsite.ru на ваш сервер
    Ответ написан
  • Как в ReactJS управлять меню с разных страниц?

    @vsuhachev
    Если вы делаете приложение с произвольной навигацией то обычно "назад" нужно нажимать в браузере, для чего на каждую страницу делается отдельный роут через адресную строку браузера (history api).

    Если же вы делаете Колдуна (Wizard) то (в простом случае) можно сделать так как описали вы, жестко привязать события к UI. А в общем случае нужно реализовать свой роутинг внутри колдуна. Ваш колдун должен понимать на какой он странице и иметь карту переключения странаиц: {[страница, событие] => страница}
    Ответ написан
    Комментировать
  • Копипастить код или писать свой?

    @vsuhachev
    Ленивые копи-пастеры уже давно придумали и используют наследование... copy&paste like a boss :)
    Ответ написан
    Комментировать
  • Как переписать запрос в ORM Ruby on Rails?

    @vsuhachev
    для вашего запроса не нужны связи, вот ка-то так
    Call.where('CallContragent' => 123).or.where('CallContact' => [123, 123, 123]) # rails 5
    Call.where('CallContragent = ? OR CallContact IN ?', 123, [123, 123, 123]) # rails 4


    А вообще в модели Call судя по всему должно быть
    belongs_to :client
    belongs_to :contact


    А в Client
    has_many :calls
    has_many :contacts, through: :calls


    В Contact - что-то аналогичное тому что с Client, только для вызовов и клиентов
    Ответ написан
    3 комментария
  • Почему возникает ошибка: "undefined method `[]' for nil:NilClass"?

    @vsuhachev
    validation это локальная переменная внутри функции field_pattern, вне этой функции ее не видно, что не исключает того что у вас есть какая-то другая переменная/функция с таким именем в той области видимости в которой вы вызываете код, падающий с ошибкой
    Ответ написан
    Комментировать
  • Как в Ruby комплектовать массив (хэш) по условию?

    @vsuhachev
    изучите методы Enumerable - each, each_with_object, map и другие. Без этого у вас продвижения вперед не будет
    Ответ написан
    Комментировать
  • Почему Immutable - это добро для js?

    @vsuhachev
    Вы даже перечислили все причины. Вот затем и надо. Или вы не верите разработчикам компиляторов, что их компиляторы будут работать быстрее с неизменяемыми данными?

    Если вам лично не надо - не используйте, делов-то :)
    Ответ написан
  • ReactJS - медленный рендеринг смонтированного компонента -?

    @vsuhachev
    *блок с фото* - это скорее всего и есть проблема тормозов. Если так, то можно подумать в сторону того чтобы инлайнить эти картинки, например.

    Ну и самый общий способ - с помощью дизайна UI ограничить видимую область и отображать только те записи которые непосредственно видны на экране. В вашем примере по кнопке "назад" нужно опять сбрасывать состояние компонента таким образом чтобы он отображал 30 записей.

    отклик 5 секунд - это ненормально вне зависимости от того react у вас или что-то другое. Приемлемым считается отклик до 1с.
    Ответ написан
    5 комментариев
  • Как настроить рабочую среду ruby (ror) + vagrant + rubymine @ win7x64?

    @vsuhachev
    3/ Поставить внуть виртуалки десктоп и работать полностью в Линуксе
    Ответ написан
  • Где согласно концепции redux-а правильно было бы хранить объект - источник данных для расчета state?

    @vsuhachev
    Лично я бы так же делал. Единственное - в стэйт компонента не нужно загружать обработанные данные. Мне кажется более верно в стэйте компонента хранить текущий выбор пользователя, а данные генерить на лету из редуцера. Или, если генерить долго, то можно сделать еще редуцеров которые будут хранить результаты вычислений для ускорения расчетов.
    Ответ написан
    Комментировать
  • Как заставить ajax выполниться один раз?

    @vsuhachev
    В turbolinks'е поменялись названия событий после какой-то версии
    Ответ написан
    Комментировать
  • ReactJS performance: разумно ли передавать большой объем данных через props?

    @vsuhachev
    Принципиальной разницы между 1) и 2) нет, в обоих случаях используются ссылки на объекты.
    Ответ написан
    Комментировать
  • Как обновлять продакшен без ребута?

    @vsuhachev
    Если речь идет только о рельсовом приложении, то нужно заранее выполнить прекомпиляцию асетов, тогда процесс рестарта не должен занимать много времени. Так же многие сервера вроде unicorn или puma поддерживают режим плавного рестарта когда старые ворекры (которые находятся в простое) гасятся постепенно и заменяются на воркеры уже с новым кодом. Т.е. ваше приложение какое-то время будет работать одновреме6нно и в старом виде и в новом, соответственно нужно четко понимать, что оно так работать может. Например, миграции должны быть написаны так чтобы это было возможно и должны отработать перед рестаром.
    Ответ написан
    5 комментариев
  • Где надо подключать connect(mapStateToProps, mapDispatchToProps)(App) для каждого компонента?

    @vsuhachev
    connect нужен для того чтобы подписать компонент на события редуцера и дать доступ к данным редуцера. А роутинг он вообще в стороне от redux (хотя, конечно, есть роутеры, работающие через redux).

    Я обычно придерживаюсь следующего: connect применяю к компонентам-контейнерам верхнего уровня, которыми управляет роутер(в вашем случае это Component-1, Component-2). Во все остальные простые (dumb) компоненты, находящиеся в контейнере, данные получают в параметрах (через props) от контейнера.

    Если вложенные компоненты должны как-то взаимодействовать с redux: для этого в компоненте-контейнере определяются функции, которые видят редуцеры и dispatch. Дальше эти функции отдаются dumb-компонентам через props и они их могут вызвать по какому-то своему событию.

    Теоретически вы можете делать connect к любому компоненту, но во первых это более накладно по ресурсам и во вторых это убивает инкапсуляцию. Прелесть т.н. "тупых" компонентов в том что они простые и зависят только от явных параметров (props) и следовательно легко переносимы. Добавляя к ним connect мы прибиваем их гвоздями к модели данных конкретного приложения.
    Ответ написан
    2 комментария
  • Как правильно осуществить миграцию столбца даты из строки в формат datetime?

    @vsuhachev
    Вам нужно делать такую миграцию в 4 этапа:
    1. создаете колонку с типом datetime с временным имененм
    2. из колонки с типом string переносите данные в колонки с datetime
    3. удаляете колонку с типом string
    4. колонку с типом datetime переименовываете в нужное имя


    И относительно вашего кода по переносу данных - так делать не рекомендуется потому что во-первых это крайне медленно, во вторых миграция зависит от класса. Представьте, через некоторое время вы доработаете класс(например переименуете аттрибут query_date) и ваша миграция перестанет работать т.к. она рассчитывает на то что код класса Page не поменялся, а он поменялся.

    Для того чтобы миграции не зависели от кода классов и не отваливались со временем нужно писать их на SQL.

    execute('update pages set new_query_date = STR_TO_DATE(query_date)')
    Ответ написан
    1 комментарий
  • Как восстанавливать бэкапы?

    @vsuhachev
    Универсальных решений нет т.к. все очень сильно завязано на приложение, его архитектуру и схему развертывания. Обычно в простых случаях восстановление делается руками, в сложных пишется скрипт.

    Из своего опыта могу сказать, что такие скрипты быстро протухают и запуск такого скрипта через полгода-год это фактически опять отладка и дописывание скрипта вперемешку с эмоциями "какой $#% это писал". В связи с чем часто приходит мысль - "а может все-таки руками проще??"
    Ответ написан
    Комментировать
  • Как вызвать компонент по event'y в react?

    @vsuhachev
    В состоянии вашего приложения вы заводите поле "уведомление". Компонент Notification выводите когда в модели заполнено это поле. Заполнение поля приводит к перерисовке компонентов и выводу Notification. По таймеру очищаете это поле, чтобы уведомление пропадало.

    Только учтите что react это лишь библиотека для вывода компонентов. Как хранить состояние вашего приложения, как уведомлять react о изменениях состояния это отдельная тема, в react для этого принято пользоваться паттерном flux.
    Ответ написан
  • Зачем нужны хелперы в контексте контроллеров/вью?

    @vsuhachev
    Считается плохим тоном добавлять слишком много кода во view. Если этот код логически относится к контроллеру или модели то нет проблем - размещаете его там. Но иногда есть код чисто для представления. Например вам нужно отобразить список тэгов с локализацией.
    I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize)

    Вы конечно можете разместить такой код в пердставлении
    <%- product.tags.each do |tag| %>
      <p>
        <%= I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize) %>
      </p>
    <%- end %>


    А можно убрать его в хэлпер

    def localized_tags(product)
      product.tags.map do |tag|
        I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize)
      end
    end


    И тогда вы получаете первое преимущество: читаемый код вьюхи
    <%- localized_tags(product).each do |tag| %>
      <p><%= tag %></p>
    <%- end %>


    И второе преимущество: вы можете переиспользовать localized_tags, написать на него тесты и т.п. И ваши модели и контроллеры не засоряются логикой представления.
    Ответ написан
    Комментировать
  • Какой выбрать фреймворк для частичного обновления DOM?

    @vsuhachev
    Поглядите на turbolinks, он как раз совмещает сервер-сайд рендеринг и ajax
    Ответ написан
    Комментировать