2011-03-21 89 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