如何在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 %>
关键逻辑说明:
- 表单路由:
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
- 删除链接路由:
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
相关产品推荐
相关产品推荐

