Rails复选框AJAX调用,不想呈现任何内容。

19

我有一个小演示,其中通过AJAX点击复选框可以切换属性。这个功能运行良好,但Rails非常希望去渲染一些东西,所以我基本上只能在我的视图中创建一个空的toggle.js.erb文件。

问题中的控制器操作:

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还比较陌生,可能有更简单的方法来实现此目的,但我现在有些困惑了。

1个回答

42

render :layout => false 表示你想要渲染 'toggle' 视图但不包含布局。

如果你不想渲染任何东西,你应该使用 :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,这是更可取的方法,但结果相同。


谢谢!这绝对有效。您的切换方法比我的好多了。之前有人提出担忧,认为某人在复选框上进行垃圾邮件攻击可能会影响切换的准确性,但我已经将其设置为在单击后禁用复选框,直到 AJAX 事件返回成功。 - clem
1
如果您需要设置状态码并立即从控制器方法返回:render :nothing => true, :status => 404 and return希望对您有所帮助! - lboix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接