2011-03-21 124 views
19

我有一个小小的演示设置,点击复选框可以通过AJAX切换属性。它工作正常,但Rails真的想渲染一些东西,所以我基本上在我的视图中创建了一个空白的toggle.js.erb文件。问题Rails复选框AJAX调用,不想渲染任何东西

控制器动作:

def toggle 
    @task = Task.find(params[:id]) 
    respond_to do |format| 
    format.js do 
     if (@task.status != true) 
     @task.status = true 
     else 
     @task.status = false 
     end 
     @task.save 
     render :layout => false 
    end 
    end 
end 

观问题:

<h1>Tasks</h1> 
    <ul style="list-style-type: none;"> 
    <% @tasks.each do |task| %> 
     <li id="<%= dom_id(task) %>"> 
     <%= check_box_tag(dom_id(task), value = nil, checked = task.status) %> 
     <%= task.action %> <%= link_to 'Edit', edit_task_path(task) %> 
     <%= link_to 'Delete', task, :confirm => 'Are you sure?', :method => :delete, :remote => true %> 
     </li> 
    <% end %> 
    </ul> 
    <%= link_to 'New Task', new_task_path %> 

    <script> 
    $$('input').each(function(el) { 
     el.observe('click', function(event) { 
     // Get the task ID 
     var elId = el.id.split("_")[1]; 
     // Build the toggle action path 
     var togglePath = '/tasks/' + elId + '/toggle/'; 
     // Create request, disable checkbox, send request, 
     // enable checkbox on completion 
     new Ajax.Request(togglePath, { 
      onCreate: function() { 
      el.disable(); 
      }, 
      onSuccess: function(response) { 
      }, 
      onComplete: function() { 
      el.enable(); 
      } 
     }); 
     }); 
    }); 
    </script> 

没有空白toggle.js.erb文件我的意见得到了,还是Rails的给我一个错误,说它试图渲染一些东西。

最终,我想都不必有一个空白的toggle.js.erb文件,并且我想将这个Prototype的东西放到我的静态JavaScript中并且不在视图中。

我对Rails很新,所以可能有一个更简单的方法来做到这一点,但我有点卡在这里。

回答

41

render :layout => false表示您想渲染'切换'视图,而无需布局。

如果您不希望渲染的所有东西,你应该使用:nothing => true选项

def toggle 
    @task = Task.find(params[:id]) 
    @task.toggle! :status 

    # if it used only by AJAX call, you don't rly need for 'respond_to' 
    render :nothing => true 
end 

编辑:在Rails4/5,你可以使用head :ok代替render nothing: true,这是要做到这一点更可取的方法,但结果是一样的。

+0

谢谢!这绝对有效。你的切换方法比我的好得多。前一个线程中的某个人已经提出了关于有人发送垃圾邮件复选框可能会导致切换准确性的担忧,但是我刚刚做出这样的设置,以便点击后禁用复选框,直到AJAX事件返回成功为止。 – clem 2011-03-25 03:10:06

+1

完美:) 如果你需要设置一个状态码,并立即从你的控制器方法返回:'render:nothing => true,:status => 404并返回' 希望它有帮助! – lboix 2014-06-06 03:30:42