【发布时间】:2020-01-30 14:55:45
【问题描述】:
不确定我是否问错了这个问题,但我似乎无法准确找到我面临的问题。
我有一个用于任务列表的非常基本的 rails 6 应用程序。任务要么完成,要么不完整,更改/更新将通过 javascript 完成(html 端工作正常)。
这是我的表单部分 _task.html.erb:
<%= form_with model: task, html: { class: "edit_task", id: "edit_task_#{task.id}" } do |f| %>
<%= f.check_box :complete %>
<%= f.submit "Update" %>
<%= f.label :complete, task.name %>
<%= link_to "(remove)", task, method: :delete, data: {confirm: "Are you sure?"}, remote: true %>
<% end %>
这里是提交表单的javascript,tasks.js
function submit_update(){
const checkboxes = document.querySelectorAll('.edit_task input[type=checkbox]');
const submitbutton = document.querySelectorAll('.edit_task input[type=submit]');
submitbutton.forEach(button => button.remove());
checkboxes.forEach(checkbox => {
checkbox.addEventListener('click', () => checkbox.parentElement.submit());
});
}
window.addEventListener('turbolinks:load', event => {
submit_update();
document.addEventListener('task_added', event => submit_update());
});
这部分工作得很好,但是一旦提交并基于控制器的这一部分
def update
@task.update!(task_params)
respond_to do |format|
format.html { redirect_to root_url, notice: 'Task successfully updated' }
format.js
end
end
我的理解是这应该一起启动 update.js.erb,目前看起来像
unction update_task() {
const current_task = document.querySelector('#edit_task_<%= @task.id %>');
const complete_tasks = document.querySelector('#complete_tasks');
const incomplete_tasks = document.querySelector('#incomplete_tasks');
<% if @task.complete? %>
complete_tasks.insertAdjacentHTML('beforeend',current_task.innerHTML);
<% else %>
incomplete_tasks.insertAdjacentHTML('beforeend',current_task.innerHTML);
<% end %>
}
update_task();
我尝试使用警报调用将上述内容更改为单行,但它仍然永远不会被调用。
如果有人可以让我知道为什么没有调用 update.js.erb,将不胜感激 :)
如果需要任何其他信息,请告诉我?
编辑:
在进一步测试中,我发现如果我通过单击按钮提交更新,即通过 javascript 删除提交,则 update.js.erb 操作正确。
所以看起来重点需要放在 tasks.js 文件上,以及它是如何提交的? 奇怪的是,当它包含在内时,提交后 HTML 格式运行正常,而不是 js 格式??
【问题讨论】:
标签: javascript ruby-on-rails-6