You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中创建带AJAX的表单局部视图实现记录更新与删除

没问题,我来帮你搞定嵌套资源下的表单路由问题!你的项目用了projects嵌套tasks的路由设置,所以所有任务相关的操作都需要带上所属的项目上下文。

修改后的局部视图 _task.html.erb

<%= form_for [@project, @task], remote: true do |f| %>
  <%= f.check_box :complete %>
  <%= f.submit "Update" %>
  <%= f.label :complete, @task.name %>
  <%= link_to "Remove", [@project, @task], method: :delete, data: {confirm: "Are you sure?"}, remote: true %>
<% end %>

关键逻辑说明:

  1. 表单路由:form_for [@project, @task] 是Rails嵌套资源的标准写法,Rails会自动识别这是一个已存在的任务记录,生成对应更新操作的路由(PUT/PATCH /projects/:project_id/tasks/:id)。不过这里要提醒你:当前你的TasksController里缺少update方法,需要补上才能处理表单提交的更新请求,同时要确保参数允许complete字段:
def update
  @project = Project.find(params[:project_id])
  @task = @project.tasks.find(params[:id])
  if @task.update(task_params)
    respond_to do |format|
      format.html { redirect_to project_path(@project) }
      format.js
    end
  end
end

private
def task_params
  params.require(:task).permit(:name, :complete)
end
  1. 删除链接路由:link_to 的路径参数用[@project, @task],配合method: :delete,Rails会自动生成销毁操作的路由(DELETE /projects/:project_id/tasks/:id),刚好对应你控制器里已有的destroy方法。

另外要注意,在渲染这个局部视图的时候,要确保@project和@task变量可用——比如在ProjectsController#show里,你应该已经获取了@project,遍历任务时可以这样传递局部变量:

<% @project.tasks.each do |task| %>
  <%= render partial: 'tasks/task', locals: { project: @project, task: task } %>
<% end %>

内容的提问来源于stack exchange,提问作者foliwe83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:06