Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CORS与Jquery Ajax到Rails API_Jquery_Ruby On Rails 4_Cors_Rails Api - Fatal编程技术网

CORS与Jquery Ajax到Rails API

CORS与Jquery Ajax到Rails API,jquery,ruby-on-rails-4,cors,rails-api,Jquery,Ruby On Rails 4,Cors,Rails Api,我使用railsapigem在Rails中创建了一个示例api,并启用了指定的CORS 我在chorme中使用“Advanced Rest api”尝试了api crud操作,效果很好。现在我只是在Rails中添加了一个spa jquery应用程序来使用API。我只是将jquery应用程序放在RailsAPI的公共目录中 我的get方法工作正常,但没有“PUT”和“PATCH”。我的客户端应用程序在同一个应用程序和机器中,所以我认为这不是其他域?我说得对吗?所以我已经启用了CORS,但没有工作。

我使用railsapigem在Rails中创建了一个示例api,并启用了指定的CORS

我在chorme中使用“Advanced Rest api”尝试了api crud操作,效果很好。现在我只是在Rails中添加了一个spa jquery应用程序来使用API。我只是将jquery应用程序放在RailsAPI的公共目录中

我的get方法工作正常,但没有“PUT”和“PATCH”。我的客户端应用程序在同一个应用程序和机器中,所以我认为这不是其他域?我说得对吗?所以我已经启用了CORS,但没有工作。我得到了类似“ActionController::RoutingError(没有与[OPTIONS]匹配的路由“/api/v1/students/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>

我也有同样的问题,我成功地解决了它(没有起诉rack cors)。 我将我的代码包括在下面:

应用程序控制器中的过滤器:

  # 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
然后在config/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]
可能Chang:post by:put会解决这个问题

我使用的是Rails'4.2.4'。
我希望能有帮助。

你为什么不使用。没什么特别的。我觉得这很简单。我会尝试一下,alsoI完成了rack cors。谢谢但是该方法错误地发现jquery在这些请求中发送了正确的头。。。例如,确保将“Content Type”标题设置为“application/json”,即使现在我也不知道为什么不这样做。但是rack cors解决了我的问题谢谢@albertjan
$.ajax({
      type: "PUT",
      url: 'myRoute',
      data: data,
      dataType: "json"
});
match 'post_action', via: [ :post, :options]