2014-08-27 35 views
0

我在rails方法update_attributes中使用ajax时遇到了问题。在js.coffee文件我送一个AJAX来计算控制器method.This Ajax是简单的,看起来像这样:在rails中使用Ajax update_attributes

  $.ajax({ 
       url: 'tasks/update_data', 
       type: 'POST', 
       data: { swap: $.cookie("swap") } 
      }); 

我试图做的是保存排掉期清爽页之后。这就是我的控制器方法应该做的事情。当我调试这个方法时,会发生什么事情:如果一旦一切正常,我就交换;当我交换两次并输出值到控制台时,它的输出类似于这第三个< =>第二个,第二个< =>第一个,但它必须先完成第三个< =>第二个,第三个< =>。所以我认为在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: '/' })。 感谢您的回答。

回答

2

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)。导轨是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 %>"); 

-

修复

为了解决您的问题,我建议退一步&考虑你尝试什么要实现。你提到你正试图交换排名 - 你为什么不在Task模型中创建position属性?

这将允许你做到以下几点:

#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 

我之所以写这篇文章是因为你的应用程序需要object orientated - 这意味着每条记录需要存储独立于任何其他

这很重要的原因是因为你目前正在试图操纵objects自己 - 在字面意义上“交换”它们。这是荒谬的&低效的 - 你会更适合只是改变了各个对象的“位置” - 让你只需要改变的对象的要求

在问候您的问题关于第二个电话 - 您需要更新您的$.cookie("swap")值才能使其正常工作

+0

我很感谢您的回答。我使用“puts”只是为了了解发生了什么。 Thx为了让这段代码更好看,我认为由于我的经验不足,我仍然编写不好的代码。现在关于你的修复:我不明白,为什么你需要创建行的实例,也许是因为我来自像C++这样的系统语言,并且最好是由于内存或者我不明白的地方做局部变量。你建议在数据库'位置'创建另一列,然后按位置排序,它是更有效的,但有点复杂,然后只是update_attr,它是有道理的。然后总结 - > – 2014-08-27 11:21:59

+0

嘿谢谢评论!我猜你是本地开发人员或Ruby开发人员。如果你想在Rails中测试,你可以使用'Rails.logger.info(“你的输出在这里)''。 – 2014-08-27 11:24:03

+0

最后,我需要总是把respond_to当我有ajax调用,在db中创建位置,按db排序,cookie值很容易改变,并把所有的渲染东西放在视图中,我是在正确的方向思考? – 2014-08-27 11:24:49