2015-03-27 2 views
0

создать один образец API в Rails, используя рельсы-апи камень и включен CORS указанного hereCORS с JQuery Ajax для Rails API

Я пытался операции апи Cr с помощью 'Advanced Rest API' в Chorme и работает нормально. Теперь я просто добавил одно приложение jQery для спама в Rails для использования API. Я просто поместил приложение jquery в общий каталог Rails API.

Мои методы get работают правильно, но не «PUT» и «PATCH». Мое клиентское приложение находится в одном приложении и машине, поэтому я думаю, что это не другой домен? я прав? Так что я уже включил CORS, но не работал. Я получил как 'ActionController :: RoutingError (нет маршрута матчей [OPTIONS] "/ API/v1/студентов/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

Почему вы не используете ['rack-cors'] (https://rubygems.org/gems/rack-cors/versions/0.3.1). – albertjan

+0

ничего особенного. Я думал, это просто. Я попробую это тоже – Akhil

+0

Я закончил со стойками. спасибо .. но u этот метод получил erros – Akhil

ответ

0

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

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

# 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 

Затем в конфиге/routes.rb ...

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

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

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

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

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

Возможно чейнинга: сообщение: положить исправит его.

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

Смежные вопросы