我试图在索引页面上调用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请求与正确的task /:id匹配时迷失了方向。我的路线特别提到了ajax请求中列出的网址:
PATCH /tasks/:id/complete(.:format)
答案 0 :(得分:1)
$.ajax({url: 'tasks#complete'
您似乎在这里使用Rails的路由语法。这些都不是有效的网址。您的网址必须如下所示:
url: "/tasks/1/complete"
当然,数字应该是动态的。 (提示:只需获取表单的action
属性并将其用作url)。
在那里看到remote: true
?这意味着您无需手动处理提交点击。它会为你执行ajax。您只需要创建一个JS视图,在项目完成时您将执行任何操作。
// views/tasks/complete.js.erb
$('#task-<%= @task.id %>').addClass('completed')
Michael Hartl的rails 14.2.5部分涵盖了几乎所有这样的场景:ajax支持的按钮可以改变某些内容,并且必须在页面上反映出更改。