#javascript #jquery #ruby-on-rails #ruby #ajax
#javascript #jquery #ruby-on-rails #ruby #ajax
Вопрос:
Я пытаюсь вызвать метод ajax на моей индексной странице, который обновляет атрибут. Атрибут обновляется (успешно) при обновлении страницы, когда задача (это для приложения «список дел») перемещается из неполного списка в список завершенных. Однако при вызове запроса ajax с помощью нажатия кнопки на моей консоли rails я получаю следующую ошибку:
ActiveRecord::RecordNotFound (Couldn't find Task with 'id'=:id [WHERE "tasks"."user_id" = ?]):
app/controllers/tasks_controller.rb:47:in `complete'
Вот мой запрос ajax:
$(document).ready(function() {
console.log("working");
$('.task_submit_box').click(function() {
$.ajax({url: 'tasks#complete', type: "PATCH", success: function(result) {
$('.task_area').html(result);
console.log('test');
}});
});
});
мой метод контроллера:
def complete
@task = current_user.tasks.find(params[:id])
@task.update_attribute(:completed_at, Time.now)
@task.update_attribute(:completed, true)
redirect_to root_path
end
Область моей индексной страницы, где она должна быть обновлена:
<ul class="wrapper_task_list">
<% @task.each do |task| %>
<% if task.completed == false %>
<li>
<div class="task_area", id="incomplete_task_area">
<%= link_to task.title, task_path(task), class: 'wrapper_task_name'%>
<%= form_for task, remote: true do |f| %>
<%= f.check_box :completed, class: 'task_check_box' %>
<%= f.submit 'update', class: 'task_submit_box' %>
<% end %>
</div>
</li>
<% end %>
<% end %>
</ul>
Я запутался, пытаясь сопоставить запрос ajax с правильной задачей /: id. в моих маршрутах конкретно упоминается URL, указанный в запросе ajax:
PATCH /tasks/:id/complete(.:format)
Ответ №1:
Где мой идентификатор?
$.ajax({url: 'tasks#complete'
Похоже, вы используете здесь синтаксис маршрута Rails. Это недопустимые URL-адреса. Ваш URL должен выглядеть следующим образом:
url: "/tasks/1/complete"
где число, конечно, должно быть динамическим. (подсказка: просто извлеките action
атрибут формы и используйте его в качестве URL).
Как на самом деле все сделать правильно здесь?
Видите это remote: true
там? Это означает, что вам не нужно вручную обрабатывать отправленные клики. Он выполнит ajax для вас. Вам просто нужно создать представление JS, где вы будете делать все, что вы делаете, когда элемент будет завершен.
// views/tasks/complete.js.erb
$('#task-<%= @task.id %>').addClass('completed')
Раздел 14.2.5 руководства Майкла Хартла по rails описывает почти именно этот сценарий: кнопка с поддержкой ajax, которая что-то меняет, и изменения должны быть отражены на странице.
Комментарии:
1. Я изменил URL на «/tasks /:id /complete» (как указано в команде rake routes), но получаю ту же ошибку. Я вижу, вы упоминаете добавление атрибута action к тегу form_for, но я не знаком с этим методом. Не могли бы вы, пожалуйста, объяснить более подробно? Спасибо
2. @snovosel: нет, я не упоминаю о добавлении атрибута действия в форму. Это уже есть. На своей странице проверьте элемент form в консоли вашего браузера, вы увидите этот атрибут.
3. да, я прочитал вторую часть ответа. Я пытаюсь выяснить, как добавить этот код в мой файл complete.js.erb (расположенный в / views / tasks). Прошу прощения, поскольку я довольно новичок в этом.
4. @snovosel быть новым — это не то, за что вы должны извиняться. 🙂 Возможно, вы захотите (повторно) прочитать руководство Hartl по rails. В частности, раздел 14.2.5 .
5. большое спасибо! Я изучу это. Еще раз спасибо за вашу помощь!