Отправить SMS с помощью nexmo gem из поля ввода в рельсах

Я пытаюсь отправить смс на номер, введенный в поле ввода, с помощью Nexmo gem

Это то, что у меня есть до сих пор, и это, похоже, не работает

страницы/test.html.erb

<%= form_tag "/pages/send_sms" do -%>
  <%= text_field_tag "number" %>
  <%= submit_tag "Send" %>
<% end -%>

маршруты.rb

Rails.application.routes.draw do
  get 'pages/home'
  post '/pages/send_sms', as: 'send_sms'
  get 'test', to: 'pages#test'
  root 'pages#home'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

pages_controller.rb

def send_sms
    @number = params[:number]
    nexmo = Nexmo::Client.new(
    key: ENV['NEXMO_API_KEY'],
    secret: ENV['NEXMO_API_SECRET']
    )
    notification = "Download the app through this link"


    response = nexmo.send_message(
      from: "GLAM360",
      to: params['number'],
      text: notification
    )
    if response['messages'].first['status'] == '0'
      redirect_to root_path
    end

  end

Вот что я вижу в терминале

Started POST "/pages/send_sms" for 127.0.0.1 at 2017-10-08 00:35:45 +0400
Processing by PagesController#send_sms as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zPj5PcZrD+uNYxvvfDio8B5uNWitg0vMw+3Vm8KbvQumbNWzsgN4sBJDKsi2srx0rSatiOISegWHQFE860
JxcA==", "number"=>"+971585959698", "commit"=>"Send"}
No template found for PagesController#send_sms, rendering head :no_content
Completed 204 No Content in 803ms

Любая помощь будет высоко оценена здесь


person Rahul Lakhaney    schedule 07.10.2017    source источник
comment
Похоже статус ответа не 0, поэтому ищет шаблон представления send_sms. Я предполагаю, что у вас нет представления для send_sms, поэтому отображается No template found for....   -  person AytanLeibowitz    schedule 08.10.2017


Ответы (1)


Сама ошибка говорит вам, что делать. У вас есть несколько вариантов.

  1. Во-первых, в вашем случае просто добавьте еще одно перенаправление, если последнее условие проверки не выполняется. В вашем случае это не удается и поэтому запрашивается шаблон по умолчанию. Если вы укажете предложение else, в котором вы описываете, куда он должен перейти (скажем, снова в форму с предупреждающим сообщением), rails сам позаботится об этом.

if response['messages'].first['status'] == '0' redirect_to root_path else redirect_to test_path end

  1. Я использовал ваш скрипт и добавил send_sms.html.erb с переменной состояния, которая передается от контроллера в соответствии с ответом функции nexmo.send_message. Вроде «Успех» или «неудача», и все работает нормально, на веб-странице он информирует меня о статусе, и я также получил текстовое сообщение. Это то, что я предпочитаю для лучшего UX. введите здесь описание изображения.
  2. Если бы мне пришлось это сделать, я бы внес много изменений в сценарий. Предложение состоит в том, чтобы никогда не полагаться на внешний API, всегда обертывать взаимодействия, которые вы делаете, с внешним API в интерфейсе. Я оберну сценарии Nextio, вытащу их из контроллера и размещу в интерфейсе (имею класс либо в lib, либо функцию-оболочку в помощнике и использую интерфейс для взаимодействия с ним) и буду взаимодействовать с ним через мой контроллер. Старайтесь не вкладывать логику в свой контроллер. Я бы также использовал блок «начало восстановления» для взаимодействия с внешним API и прочитал бы обо всех ошибках и подумал, как с ними справиться. Наконец, для потока я бы дал пользователям больше информации, а не заставлял их зависать. Я бы перенаправил их на другую страницу, например send_sms, и дал бы им статус или использовал предупреждающие сообщения, чтобы сообщить им, каков статус.
  3. Наконец, я бы использовал фоновые задачи для этих заданий (что может занять некоторое время в зависимости от внешних серверов). Используйте что-то вроде sidekiq.
person Saurav Prakash    schedule 07.10.2017
comment
Привет, Саурав, спасибо за ответ. Не могли бы вы поделиться со мной кодом? Я добавил оператор else, хотя SMS, похоже, все еще не проходят. - person Rahul Lakhaney; 08.10.2017
comment
Эй, наконец-то я заработал. Спасибо, что указали мне правильное направление. - person Rahul Lakhaney; 09.10.2017