问题描述
控制器:
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 而不是在新视图和编辑视图中重复相同的表单。