Routes.rb编辑表单重定向失败

时间:2013-12-15 09:09:13

标签: ruby-on-rails ruby forms

我正在做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| %>

3 个答案:

答案 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帖子使用的路径