在 rails 中编辑表单 - 没有路线匹配 [PUT]

问题描述

我有一个用于创建任务的表单。

控制器:

class ProjectsController < ApplicationController
  before_action :authenticate_user!

  def index
    @projects = Project.where(user_id: current_user.id)
  end

  def new
    @project = Project.new
  end

  def create
    @project = Project.new
    @project.title = project_params[:title]
    @project.user_id = current_user.id

    if @project.save
      redirect_to root_url
    else
      flash[:error] = @project.errors.to_a
      render :new
    end
  end

  def destroy
    @project = current_user.projects.find_by(params[:id])

    flash[:error] = @project.errors.to_a unless @project.destroy

    redirect_to root_url
  end

  def edit
    @project = current_user.projects.find_by(params[:id])
    render :edit
  end



  def update
  end  

  private

  def project_params
    params.require(:project).permit(:title)
  end
end

我的路线:

Rails.application.routes.draw do
  devise_for :users
  resources :projects
  root 'projects#index'
end

new.html.haml

.create_project_form
    = form_with model: @project,url: "/projects",method: :post do |form|
        = form.text_field :title,{ placeholder: 'New Project' }
        = form.submit 'Create project'

我可以创建任务,但无法更新。

edit.html.haml

.edit_project_form
    = form_with model: @project,method: :put do |form|
        = form.text_field :title,{ placeholder: 'Edit' }
        = form.submit 'Update project'

当我提交表单时,出现错误 - 没有路由匹配 [PUT] "/projects"

据我所知,我必须在某处传递一个 id

= form_with model: @project,method: :put do |form|

但是我找不到合适的方法来做到这一点 请帮忙

解决方法

您的编辑表单提交到了错误的路径。在 Rails 中,您可以通过向成员路由 /projects/:id 发送 PATCH 请求来更新资源。 Rails 已不再使用 PUT to PATCH back in 2012,但由于遗留原因仍会生成 PUT 路由。

您甚至不需要首先在这里明确提供路径和方法。而是在配置 Rails 风格上使用约定:

# app/views/projects/_form.html.rev
= form_with(model: @project) 
  #...

Rails 将通过检查记录是否已保存来找出正确的路线和方法。

use a partial 而不是在新视图和编辑视图中重复相同的表单。