Приложение Rails следует действиям контроллера, за исключением мобильных браузеров, где оно пытается превратить POST в загрузку - PullRequest
0 голосов
/ 24 мая 2018

Приложение My Rails 5 выполняет четыре вызова API и отображает результаты на странице шоу.У меня есть button_to, которая вызывает запрос Ajax POST на странице шоу, чтобы пользователи могли голосовать за своих избранных.Это вызывает некоторые JS, который отлично работает в разработке и производстве на моем ноутбуке.Браузеры на моем iphone, тем не менее, используют полный URI контроллера и пытаются загрузить его.Button_to возвращает 204: нет содержимого.

Я попытался перенаправить на другую страницу / шоу после вызова Ajax, а также перенаправить с помощью браузера gem, если пользователь на мобильном телефоне, но эти страницы вылетают, если пользователь обновляет их.Я попытался явно вернуть состояние 200 в контроллере, но для этого требуется перенаправление.Я хочу, чтобы пользователь оставался на странице / show, поэтому больше ничего с перенаправлением не работает для меня.

В модели:

def self.first_api(term)
  call_url = FIRST_CALL_URL
  response = HTTParty.get(call_url,
    { headers: {
      "Accept": "application/json",
      "app_id": "#{ENV['FIRST_API_APP_ID']}",
      "app_key": "#{ENV['FIRST_API_APP_KEY']}" }
    })

  if response.include?("!DOCTYPE")
    "NO DEFINITION"
  else
    response
  end
end

Контроллер (усеченный):

def show
  @full_call = FullCall.find(params[:id])
end

def create
  @full_call = FullCall.where(word:full_call_params[:word]).first_or_create do |call|
    call.first_api_response = FirstCall.first_api(call.word)
  end
end

if @full_call.save
  redirect_to @full_call
else
  render 'new'
end

def vote_for_first
  @full_call.first_vote += 1
  @full_call.save
end

private

    def full_call_params
      params.require(:full_call).permit(:word, :definition)
    end

Соответствующие маршруты:

resources :full_calls
post 'vote_for_first', to: 'full_calls#vote_for_first'

/ показать страницу:

<p>
  <div>
    <h2 id='full-call-heading'><%= @full_call.word.upcase %></h2>
    <div id='full-call-alert'></div>
  </div>
</p>

<div class="container">
  <div class="card-title">
    <div class="card card-default">
      <div class="card-header"><strong>First Call Definition:</strong>
        <div>
          <%= button_to('VOTE FOR FIRST', { controller: 'full_calls',
                                         action: 'vote_for_first',
                                         id: @full_call,
                                         remote: true },
                                       { class: "btn btn-outline-secondary btn-sm vote-btn" }) %>
        </div>
      </div>
    <div class="card-block"><%= @full_call.first_api_response %></div>

application.js

$(document).on('turbolinks:load', function() {
  $('.vote-btn').on('click', function() {
    setTimeout(function() {
      $('.vote-btn').attr('disabled', true);
      $('#full-call-alert').append("<h5>Thanks for voting!</h5>").hide().slideDown('slow');
    }, 100);
  });
});

И, наконец, URL-адрес, который возвращает сообщение «Ошибка загрузки» только в мобильных браузерах:

myapp.herokuapp.com/vote_for_first?id=12&remote=true

Любые идеи?

...