Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (5)

Наибольший вклад в теги

Все теги (79)

Лучшие ответы пользователя

Все ответы (263)
  • Стоит ли сегодня переплачивать за сайт на ruby? Или сэкономить на php?

    @vsuhachev
    Расширяемое и производительное приложение можно разработать на любом языке, вопрос как всегда в исполнителях.

    Вы рассуждаете слишком наивно: вложу в 2 раза меньше и получу то же самое. Увы, получить вы можете все что угодно от в 10 раз лучше до в 10 раз хуже, независимо от технологии.

    Если речь идет об одном и том же разработчике - все равно одной технологией (PHP) он владеет лучше и возможно вам предлагают еще и оплатить свое обучение (Rails) с не прогнозируемым для вас результатом.

    Если это разные разработчики, то тут нужно смотреть и сравнивать. Возможно те кто просят дешевле и делают хуже. Или, например, стандартные требования укладываются в их CMSку, а вот расширенные - ценник может вырасти в 5 раз.

    В любом случае с разработчиками нужно заранее обсудить программу-максимум, уточнить во сколько она выльется по времени и средствам.

    PS: почитал тут про тормознутость ruby от коллег php-шников, кратко - это миф из давнего прошлого, современному положению дел не соответствует
    Ответ написан
    Комментировать
  • Как сделать правильно ajax запрос в React Redux?

    @vsuhachev
    Т.к. ajax запросы асинхронные то на каждый такой запрос делается 3 ветки развития событий:
    • запрос отправлен
    • запрос завершился успешно
    • запрос завершился с ошибкой


    В коде это будет выглядеть как-то так
    export function loadInfo() {
        return dispatch => {
    
            dispatch({
                type: 'LOAD_INFO_REQUESTED'
            });
    
            request.get(
                Routes.root_path(),
                {headers: {'Accept': 'application/json'}}
            )
                .then(result => {
                    dispatch({
                        type: 'LOAD_INFO_OK',
                        info: result.data
                    })
                })
                .catch(result => {
                    dispatch({
                        type: 'LOAD_INFO_FAIL',
                        errors: result.statusText
                    })
                })
        }
    }

    Т.е. сначала экшн оповещает хранилище(store) что начал запрос и делает сам запрос. Далее в зависимости от результата хранилище будет оповещено либо от успехе либо об неудаче.
    Чтобы получить доступ к dispatch внутри экшена используется redux-thunk, который вы уже установили.

    Далее редуцер, обрабатывается 3 типа событий из экшена
    const defaultState = { loading: false, info: null, errors: null };
    
    export default function info(state = defaultState, action) {
      switch (action.type) {
    
        case LOAD_INFO_REQUESTED:
          return { loading: true };
    
        case LOAD_INFO_OK:
          return { loading: false, info: action.info, errors: null };
    
        case LOAD_INFO_FAIL:
          return { loading: false, info: null, errors: action.errors };
    
        default:
          return state;
      }
    }


    Компонент должен быть подключен к хранилищу с помощью connect, без него компонент не увидит store
    @connect(state => ({
        info: state.info
    }))
    
    class Info extends Component {
    
        componentDidMount() {
            const { dispatch } = this.props;
            dispatch(loadInfo()) // Вызываем загрузку
        }
    
      render() {
        const { loading, info, errors } = this.props.info;
    
        if (loadind) { return (<div>Loading</div>) }
        if (errors != null) { return (<div>Error!</div>) }
        return (
          <div>
            { info }
          </div>
        );
      }
    }


    Вобщем как-то так. В хэлпе на redux это все описано.
    Ответ написан
    5 комментариев
  • Увлекся изучением Ruby, поэтому хотелось бы узнать, какая вообще занятость у Ruby программиста?

    @vsuhachev
    И стоит ли заниматься изучением Ruby, без дальнейшего освоения RoR?

    По моему Руби неплохой язык и без рельс. Думаю, если он нравится, то стоит изучать и использовать в качестве "glue language". Как у "клея" у него есть следующие преимущества:

    1. Мощный современный ОО-язык с лаконичным синтаксисом и продуманной стандартной библиотекой
    2. Возможность писать свой DSL(осваивается быстро, полно примеров)
    3. REPL
    4. Интерпретатор есть на всех популярных платформах, а так же на java
    5. Мощный пакетный менеджер (gems+bundler)
    6. Билд-система из коробки (rake)
    7. Куча дополнительных библиотек и огромное комьюнити
    8. Язык активно развивается


    Ну и веб на руби это не только рельсы
    Ответ написан
    5 комментариев
  • Где надо подключать connect(mapStateToProps, mapDispatchToProps)(App) для каждого компонента?

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

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

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

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

    @vsuhachev
    Проблема в том что вы не создаете много объектов Photo каждый с одной картинкой (как вы описали в вашей модели), а создаете один Photo и пытаетесь воткнуть в него несколько файлов картинок

    Чтобы все работало так как вы хотите вам нужно
    1) В форме иметь просто одно поле с картинками, не забудьте его разрешить для strong parameters
    = form_for [:admin, @post], html: { multipart: true } do |f|
        = f.file_field :images, multiple: true


    2) В методе контроллера перебрать массив params[:images] и для каждого изображения создать свой объект Photo и привязать его к родительскому Post
    params[:images].each do |image|
      @post.photos.build(image: image)
    end
    Ответ написан
    1 комментарий

Лучшие вопросы пользователя

Все вопросы (2)