我正在做2个表单,1表示创建,1表示编辑。创建表单非常有用。编辑表单生成此错误
No route matches [PATCH] "/admin/posts/14/edit"
在表单中,我猜问题是“补丁”。我将其更改为“edit”和url admin_posts_path,就像“创建”表单一样,但这会生成一个新项目,而不是编辑当前项目。这是我在此部分的佣金路线
admin_posts GET /admin/posts(.:format) admin/posts#index
POST /admin/posts(.:format) admin/posts#create
new_admin_post GET /admin/posts/new(.:format) admin/posts#new
edit_admin_post GET /admin/posts/:id/edit(.:format) admin/posts#edit
admin_post GET /admin/posts/:id(.:format) admin/posts#show
PUT /admin/posts/:id(.:format) admin/posts#update
DELETE /admin/posts/:id(.:format)
这是形式或至少是重要部分
<%= form_for :post, url: edit_admin_post_path(@post),:html => { :multipart => true }, method: :patch do |f| %>
答案 0 :(得分:1)
edit_admin_post
仅适用于GET http动词。
您的表单应引用PUT /admin/posts/:id
来更新您的帖子。
将表单更改为:
<%= form_for @post, { multipart: true } do |f| %>
<% end %>
答案 1 :(得分:1)
edit
操作仅响应GET请求。实际更新在update
操作中完成,该操作响应PUT(如果使用Rails 4则为PATCH)。
您的编辑表单应以此开头:
<%= form_for :post, url: admin_post_path(@post),:html => { :multipart => true }, method: :put do |f| %>
您还可以将其简化为:
<%= form_for @post, html: { multipart: true } do |f| %>
这会自动将表单操作设置为PUT admin/posts/:id
现有记录,POST admin/posts
表示新记录。
答案 2 :(得分:1)
如果您的create
操作有效,则无需通过url
进行编辑。 Rails可以通过调用new_record?
方法来确定选择哪条路径。如果对象为new_record
,则rails将使用admin/posts#create
方法,但如果您的对象不是new_record
,则rails将使用admin/posts#update
方法。所以你的控制器看起来像这样
class Admin::PostsController < ApplicationController
def new
@post = Post.new
end
def create
//some code
end
def edit
@post = Post.find(params[:id])
end
def update
//some code
end
end
并且您可以像这样创建form
form_for @post do |f|
//code here
end
现在rails可以自动确定new
帖子和editing
帖子使用的路径