Ruby on rails 为什么我的rails控制器要回滚我的ajax提交?

Ruby on rails 为什么我的rails控制器要回滚我的ajax提交?,ruby-on-rails,Ruby On Rails,我遇到了一个神秘的问题,控制器接收到我的ajax请求,但没有将其保存到数据库中。在我的服务器日志中,我看到: Started POST "/collection_maps" for 127.0.0.1 at 2014-07-07 07:14:04 -0600 Processing by CollectionMapsController#create as */* Parameters: {"collection_id"=>"2", "manufacturer_id"=>"1",

我遇到了一个神秘的问题,控制器接收到我的ajax请求,但没有将其保存到数据库中。在我的服务器日志中,我看到:

Started POST "/collection_maps" for 127.0.0.1 at 2014-07-07 07:14:04 -0600
Processing by CollectionMapsController#create as */*
  Parameters: {"collection_id"=>"2", "manufacturer_id"=>"1", "package_id"=>"14"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
  Rendered collection_maps/create.js.erb (1.9ms)
Completed 200 OK in 19.2ms (Views: 4.8ms | ActiveRecord: 0.2ms)
127.0.0.1 - - [07/Jul/2014 07:14:04] "POST /collection_maps HTTP/1.1" 200 - 0.0627
我在浏览器中从create.js.erb文件收到的响应表明参数为null——但正如您在上面看到的,它们显然在那里。 (响应仅以文本形式出现,浏览器不执行代码,但这是另一个问题。我认为。)

以下是我的ajax代码:

$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()},
       });
$.ajax({url:'',
键入:“POST”,
beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-Token',
'')},
数据类型:“js”,
数据:{'collection\u id':this.value,
'制造商id':$(“#补救措施_制造商id选项:选中”).val(),
'package_id':$(“#补救措施_package_id选项:选中”).val(),
});
最后,我的模型:

class CollectionMap < ActiveRecord::Base
  belongs_to :manufacturer
  belongs_to :package
  belongs_to :collection
  validates_presence_of :package_id, :manufacturer_id, :collection_id
  attr_protected :created_at
  attr_protected :updated_at
  attr_accessible :package_id, :manufacturer_id, :collection_id
end
class CollectionMap
我完全不知所措,因此非常感谢您的帮助


更新:我的浏览器没有执行控制器返回的javascript的原因是我在ajax请求中有
数据类型:“js”
。应该是
数据类型:“script”
。在你剪切和粘贴的地方要小心

您的AJAX请求正在发回您需要的三个参数,但是您的控制器操作正在查找嵌套在
:collection\u map
键下面的参数。您可以将控制器更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
或者将AJAX请求更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
$.ajax({url:'',
键入:“POST”,
beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-Token',
'')},
数据类型:“js”,
数据:{'collection\u map':{'collection\u id':this.value,
'制造商id':$(“#补救措施_制造商id选项:选中”).val(),
'package_id':$(“#补救措施_package_id选项:选中”).val()},
});

更改AJAX请求可能更可取;将参数嵌套在单个键下更“像Rails”/惯用

您的AJAX请求正在发回您需要的三个参数,但是您的控制器操作正在查找嵌套在
:collection\u map
键下面的参数。您可以将控制器更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
或者将AJAX请求更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
$.ajax({url:'',
键入:“POST”,
beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-Token',
'')},
数据类型:“js”,
数据:{'collection\u map':{'collection\u id':this.value,
'制造商id':$(“#补救措施_制造商id选项:选中”).val(),
'package_id':$(“#补救措施_package_id选项:选中”).val()},
});

更改AJAX请求可能更可取;将参数嵌套在单个键下更“像Rails”/惯用

您的AJAX请求正在发回您需要的三个参数,但是您的控制器操作正在查找嵌套在
:collection\u map
键下面的参数。您可以将控制器更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
或者将AJAX请求更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
$.ajax({url:'',
键入:“POST”,
beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-Token',
'')},
数据类型:“js”,
数据:{'collection\u map':{'collection\u id':this.value,
'制造商id':$(“#补救措施_制造商id选项:选中”).val(),
'package_id':$(“#补救措施_package_id选项:选中”).val()},
});

更改AJAX请求可能更可取;将参数嵌套在单个键下更“像Rails”/惯用

您的AJAX请求正在发回您需要的三个参数,但是您的控制器操作正在查找嵌套在
:collection\u map
键下面的参数。您可以将控制器更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
或者将AJAX请求更改为:

def create
    @collection_map = CollectionMap.new(params)
    flash[:notice] = "Collection map successfully added" if @collection_map.save
    respond_with( @collection_map,  :layout => !request.xhr?)
end
$.ajax({ url: '<%="#{collection_maps_path}"%>',
         type: 'POST',
         beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',
                                                         '<%="#{form_authenticity_token}"%>')},
         dataType: "js",
         data: {'collection_map': {'collection_id' : this.value, 
                'manufacturer_id' : $("#remedy_manufacturer_id option:selected").val(),
                'package_id' : $("#remedy_package_id option:selected").val()}},
       });
$.ajax({url:'',
键入:“POST”,
beforeSend:function(xhr){xhr.setRequestHeader('X-CSRF-Token',
'')},
数据类型:“js”,
数据:{'collection\u map':{'collection\u id':this.value,
'制造商id':$(“#补救措施_制造商id选项:选中”).val(),
'package_id':$(“#补救措施_package_id选项:选中”).val()},
});

更改AJAX请求可能更可取;将参数嵌套在单个键下更“像Rails”/惯用

您还混合了
attr\u accessible
attr\u protected
。选择一个。或者,如果这是一个较新的Rails(4.0+)项目,请使用新的params方法,在您的
collectionAPSController

中创建一个类似“collection\u map\u params”的“protection”方法,您还混合了
attr\u accessible
attr\u protected
。选择一个。或者,如果这是一个较新的Rails(4.0+)项目,请使用新的params方法,在您的
collectionAPSController

中创建一个类似“collection\u map\u params”的“protection”方法,您还混合了
attr\u accessible
attr\u protected
。选择一个。或者,如果这是一个较新的Rails(4.0+)项目,请使用新的params方法,在您的
collectionAPSController

中创建一个类似“collection\u map\u params”的“protection”方法,您还混合了
attr\u accessible
attr\u protected
。选择一个。或者如果这是较新的Rails(4.0