CORS с Jquery Ajax для Rails API

Я создаю один пример API в Rails, используя rails-api gem, и включил CORS, указанный здесь

Я попробовал операции api crud, используя "Advanced Rest API", и работал нормально. Теперь я добавил в Rails одно приложение spa jquery для использования API. Я просто поместил мое приложение jquery в публичный каталог Rails API.

Мои методы get работают правильно, но не "PUT" и "PATCH". Мое клиентское приложение находится в том же приложении и на компьютере, так что я думаю, что это не другой домен? я прав? Так я уже включил CORS, но не работает. Я получил, как 'ActionController::RoutingError (Нет подходящих маршрутов [ОПЦИИ] "/api/v1/student /1"):'

Пожалуйста, помогите мне решить эту проблему..

Моя страница клиента

<form>
<table role="presentation">
  <tr><td>First name</td> 
  <td>
  <input name="FirstMidName" data-val="true" data-val-required="First name is required" class="form-control">
  <span class="field-validation-valid" data-valmsg-for="FirstMidName" data-valmsg-replace="true"></span>
  </td>
  </tr>
  <tr><td>Last name</td>  
  <td>
  <input name="LastName" class="form-control" data-val="true" data-val-required="Last name is required" >
  <span class="field-validation-valid" data-valmsg-for="LastName" data-valmsg-replace="true"></span>
  </td>
  </tr>  
  <tr>
  <td>Enrollment date</td>      
  <td>
    <input name="EnrollmentDate" class="form-control" data-val="true" data-val-required="Enrollment date is required" >
    <span class="field-validation-valid" data-valmsg-for="EnrollmentDate" data-valmsg-replace="true"></span>
  </td>
  </tr>
</table>
<input type="hidden" name="id" />
<input type="hidden" name="_method" value="PUT" />
<input type="submit" value="update" class="btn btn-default" onclick="return updateData(this)"/>

</form>


<script>
function Success(result){
alert("Data Saved successfully");
window.location.hash="#contact-list";
}

function Failure(err){
alert("Error");
}


function updateData(_this){


$.ajax({
        url: "http://localhost:3000/api/v1/students/1",
        type: 'PUT',
        data:$(this).closest('form').serialize(),
        success : function(result){
        alert('done');
        },
        error : function(xhr, txt, err){
        alert(err);
        }

        });

return false;
}

</script>

И мой базовый контроллер

class Api::BaseController < ApplicationController

  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
    headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Accept, Authorization, Token'
    headers['Access-Control-Max-Age'] = "1728000"
  end

  def cors_preflight_check
    if request.method == :options
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
      headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version, Token'
      headers['Access-Control-Max-Age'] = '1728000'

      render :text => '', :content_type => 'text/plain'
    end
  end
end

И мой маршрут

namespace :api, :defaults => {:format => :json} do
    namespace :v1 do

      controller :students, path: '/students/:id' do
        match 'post_action', via: [ :post, :options]
      end

      resources :students

    end
  end

1 ответ

У меня была такая же проблема, и мне удалось ее исправить (без предъявления обвинения в стойке). Я включил мой код ниже:

Фильтры в контроллере приложения:

  # Enable CORS
  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers

Методы CORS:

  def cors_preflight_check
    if request.method.downcase.to_sym == :options
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
      headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version'
      headers['Access-Control-Max-Age'] = '1728000'
      render :text => '', :content_type => 'text/plain'
    end
  end

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
    headers['Access-Control-Max-Age'] = "1728000"
  end

Тогда в конфиге /rout.rb...

match 'myRoute', to: 'myController#myMethod', via: [:put, :options]

и код клиента...

$.ajax({
      type: "PUT",
      url: 'myRoute',
      data: data,
      dataType: "json"
});

Я думаю, что проблема в вашем коде заключается в следующем:

match 'post_action', via: [ :post, :options]

Наверное, чан: post by: put это исправит.

Я использую Rails '4.2.4'. Я надеюсь, что это помогает.

Другие вопросы по тегам