Ruby on rails 为什么我的rails控制器要回滚我的ajax提交?
我遇到了一个神秘的问题,控制器接收到我的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",
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