我正在尝试不使用表单的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真实性令牌之前。