Rails-флажок вызова AJAX, не хочу ничего рендерить - PullRequest
19 голосов
/ 21 марта 2011

У меня есть небольшая демонстрационная установка, в которой щелчок флажка переключает атрибут через 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, и я хотел бы добавить этот прототип в мой статический JavaScript-код и из вида.

Я довольно новичок в Rails, так что, возможно, есть более простой способ сделать это, но я застрял здесь.

1 Ответ

42 голосов
/ 21 марта 2011

render :layout => false означает, что вы хотите визуализировать «переключаемый» вид без макета.

Если вы вообще не хотите ничего делать, вы должны использовать :nothing => true option

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, это более предпочтительный способ сделать это, но результат тот же.

...