使用自定义AJAX请求时,数据未插入数据库,而无需在Rails中表格



我正在尝试不使用表单的ajax post请求,这是我的视图,

查看

<div class="col-md-12">
    <input value="<%= session[:user_id]%>" id="user_id" hidden>
    <%= link_to "Add New", new_task_list_path, :remote => true, :class =>"btn btn-xs add-list" %>
</div>

ajax

$(document).on('click','.add', function(){
  user_id = $('#user_id').val();
  var name = $('.new-list').val();
  var current = $(this);
  if(name){
    $.ajax({
      method: 'POST',
      url: action,
      dataType: 'JSON',
      data: { 
        task_list: {
          name: name, 
          user_id: user_id 
        }
      }
    }).success(function(e){
      $(current).parent().parent().parent().before(
        '<div class="col-md-12">'+
          '<a href="#" class="btn btn-xs list ">'+name+'</a>'+
        '</div>'
        );
      $(current).parent().parent().parent().remove();
      $('.add-list').show();
    });
  }else{
    alert('please add title');
  }
});

控制器

def create
    @task_list = TaskList.new(task_list_params)
end
private
def task_list_params
    params.require(:task_list).permit(:user_id, :name)
end 

在此处,单击"添加新按钮"时,AJAX POST请求是触发的,并且参数将传递给控制器,返回的状态代码为204,但没有插入数据库表。

我正在将Postgres用于数据库。请帮助我确定我做错了什么。

ps:我是Rails的新手,如果这是愚蠢的问题,请原谅您是否需要更多细节。

我认为CSRF令牌发生了这个问题。您可以使用波纹管 -

来解决此问题。

步骤1.将CSRF令牌添加到您的应用程序布局文件中作为元标记。

# app/views/layouts/application.html.erb
<head>
 ....
 <%- if protect_against_forgery? %>
   <meta name="authenticity-token" id="authenticity-token" content="<%= form_authenticity_token %>" />
 <% end %>
 ....
</head>

步骤2.创建一个新的JS文件

# app/assets/javascripts/csrf_token.js
$(function(){
 // always pass csrf tokens on ajax calls
 $.ajaxSetup({
    headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
  });
});

步骤3.将上面的JS文件添加到application.js和您的应用程序JS文件外观

# app/assets/javascripts/application.js
//= require rails-ujs
//= require jquery
//= require turbolinks
//= require csrf_token.js

现在您的Ajax代码应该起作用,因为在Ajax上方代码设置Rails真实性令牌之前。

最新更新