我在使用带有Rails方法update_attributes的ajax时遇到问题。在js.coffee文件中,我正在发送一个ajax来计算控制器方法。这个ajax很简单,看起来像这样:
$.ajax({
url: 'tasks/update_data',
type: 'POST',
data: { swap: $.cookie("swap") }
});
我想做的是刷新页面后保存行交换。这就是我的控制器方法应该做的。当我调试该方法时,就会发生这种情况:如果我交换一次,一切都很好;当我交换两次并向控制台输出值时,它的输出类似于此first <=> second,second <=> first,但是它必须首先输出second <second>,second << >>。因此,我认为db的更新机制有些麻烦,我不明白为什么它会以这种方式工作。在这之间,在任何时候,当update_attributes被调用时,它都会返回true,因此不会失败地更新db。这是控制器方法的样子:
def update_data
ids = params[:swap].split('&')
puts ids
puts "--------------------------------------------------"
row1 = Task.where( id: ids[0] ).first
row2 = Task.where( id: ids[1] ).first
puts "first: " + row1.name
puts "second: " + row2.name
temp_hash1 = { name: row1.name, status: row1.status, project_id: row1.project_id, dead_line: row1.dead_line }
temp_hash2 = { name: row2.name, status: row2.status, project_id: row2.project_id, dead_line: row2.dead_line }
k = row1.update_attributes( temp_hash2 )
puts "first: " + row1.name
puts k
m =row2.update_attributes( temp_hash1 )
puts "second: " + row2.name
puts m
render nothing: true
end
Cookie值:$.cookie( "swap", $.cookie("swap") + row_id + "&" + prev_row_id, { path: '/' } )
。谢谢回答。
MVC
您的控制器可能会更好:
#app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def update_data
ids = params[:swap].split('&')
row1 = Task.find ids.first
row2 = Task.find ids.last
row1.update row2
row2.update row1
end
end
根据经验,切勿puts
在控制器中包含直接输出()。Rails是MVC-意味着所有“输出”都应放置在您的中views
。在渲染“无”的同时,您应该将其真正转化为对视图/控制器的某种响应
--
阿贾克斯
当您调用ajax请求时,就像调用“正常”请求一样。即使您不想收到回应,您仍然需要以相同的方式处理它们
我的意思是,如果您想接收成功或错误回调,则需要执行以下操作:
#app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def update_data
...
@message = "Success"
respond_to do |format|
format.js #-> app/views/tasks/update_data.js.erb
end
end
end
#app/views/tasks/update_data.js.erb
alert("<%=j @message %>");
--
使固定
为了解决您的问题,我建议您退后一步,考虑您要实现的目标。您提到您要交换行位置-为什么不只position
在Task
模型中创建一个属性?
这将允许您执行以下操作:
#app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def update_data
ids = params[:swap].split('&')
@row1 = Task.find ids.first
@row2 = Task.find ids.last
@row1.update_attributes(position: @row2.position)
@row2.update_attributes(position: @row1.position)
#response here
end
end
我写这篇文章的原因是因为您的应用程序需要面向对象-意味着每条记录都必须独立于其他任何记录进行存储。
这很重要的原因是因为您当前正在尝试操纵objects
自己-从字面意义上“交换”它们。这是荒谬的和低效的-你会多少更适用于只是改变了各个对象的“位置” -按要求让你只需要改变的对象
关于您第二次通话的问题-您需要更新您的$.cookie("swap")
值才能使其正常运行
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句