S-anches
@S-anches
Любитель всего и вся.

RoR. Как правильно обработать ошибку приходящую от API?

Всем привет. Есть у меня значит контроллер vk_tracks, в нем есть метод add, Этот метод добавляет аудиозапись к пользователю. Иногда при большом кол-ве запросов вылетает captcha и эту капчу надо обработать. Для vk api я пользуюсь этим гемом: https://github.com/7even/vkontakte_api
Все запросы выполняются через ajax.
Вот код:
def add
    @vk_track = VkTrack.find(params[:id])
    if params[:captcha]
      id = @vk.audio.add(audio_id: @vk_track.vk_id, owner_id: @vk_track.owner_id, captcha_sid: params[:captcha_sid], captcha_key: params[:captcha])
      respond_to do |format|
        format.html {}
        format.js   {}
      end
    else
      begin
        @vk.audio.add(audio_id: @vk_track.vk_id, owner_id: @vk_track.owner_id)

        respond_to do |format|
          format.html {}
          format.js   {}
        end
      rescue VkontakteApi::Error => @e
        if @e.error_code == 14
          respond_to do |format|
            # тут мы просто выводим модальное окно а в нем картинку с капчей и форму
            format.js { render :file => "vk_tracks/captcha.js.erb" }
          end
        else
          raise
        end
      end
    end
  end


Я в руби новенький и не могу понять как сделать правильно. Сейчас у меня при сработке капчи вылетает модальное окно с капчей и формой. Эта форма отправляет данные в тот же контроллер и метод. Есть ли путь проще? И как правильнее сделать обработку капчи.
  • Вопрос задан
  • 553 просмотра
Решения вопроса 1
rinat_crone
@rinat_crone
Chef Technical Officer
def add
  vk_track = VkTrack.find(params[:id])
  
  @vk.audio.add(audio_params(vk_track))
rescue VkontakteApi::Error => e
  raise e unless e.error_code == 14

  respond_to do |format|
    # Старайтесь не делать ваши вьюхи зависимыми от инстанс-переменных (@var)
    # По возможности, старайтесь использовать partials и передавать
    # зависимости явным образом
    # file: app/views/controller_name/_captcha.js.erb
    # в нем будет доступна переменная exception
    format.js { render partial: 'captcha', exception: e }
  end
end

def audio_params(vk_track)
  {
    audio_id: vk_track.vk_id,
    owner_id: vk_track.owner_id
  }.merge(captcha_params)
end

def captcha_params
  return {} unless params[:captha]

  {
    captcha_sid: params[:captcha_sid],
    captcha_key: params[:captcha]
  }
end


Скажу честно, я не проверял работоспособность кода, но вроде проблем возникнуть не должно никаких.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы