路由错误 - 没有路由匹配[POST]“/ posts / new”

问题描述 投票:8回答:8

我正在浏览rubyonrails.org的“博客教程”,当我尝试提交“帖子”时出现此错误:路由错误 - 没有路由匹配[POST]“/ posts / new”

我将教程中的代码复制并粘贴到我的代码中。这应该返回带有帖子的文本和标题的哈希值,但是我得到了上面的错误。

这是我的观点:

<%= form_for :post, url: posts_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

这是我的控制器:

class PostsController < ApplicationController
    def new
    end

    def create
        render text: params[:post].inspect
    end
end

这是我的routes.rb:

Blog::Application.routes.draw do
    resources :posts
end

rake路线给出了:

    posts GET    /posts(.:format)          posts#index
          POST   /posts(.:format)          posts#create
 new_post GET    /posts/new(.:format)      posts#new
edit_post GET    /posts/:id/edit(.:format) posts#edit
     post GET    /posts/:id(.:format)      posts#show
          PUT    /posts/:id(.:format)      posts#update
          DELETE /posts/:id(.:format)      posts#destroy

以下是rails s窗口生成的内容:

Started POST "/posts/new" for 127.0.0.1 at 2013-10-05 21:17:52 -0400

ActionController::RoutingError (No route matches [POST] "/posts/new"):
  actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.13) lib/rails/rack/logger.rb:32:in `call_app'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `block in call'
  activesupport (3.2.13) lib/active_support/tagged_logging.rb:22:in `tagged'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.13) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.5) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/static.rb:63:in `call'
  railties (3.2.13) lib/rails/engine.rb:479:in `call'
  railties (3.2.13) lib/rails/application.rb:223:in `call'
  rack (1.4.5) lib/rack/content_length.rb:14:in `call'
  railties (3.2.13) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.5) lib/rack/handler/webrick.rb:59:in `service'
  C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'


  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templat
es/rescues/routing_error.erb within rescues/layout (1.0ms)

我在其他教程中遇到了同样的错误,我试图遵循verbatum。我错过了什么?

谢谢。

ruby-on-rails rails-routing
8个回答
4
投票

我相信你的问题可能与这条线有关:

<%= form_for :post, url: posts_path do |f| %>

将其更改为:

<%= form_for @post do |f| %>

我遇到了同样的问题。 /posts/new正在加载,但是当我提交表单时,我收到了路由错误。

你应该有newedit动作的相同形式,在_form.html.erb文件夹中有一个名为/views/posts的独立文件。

然后,在您的newedit视图中,您可以参考此表单:

<%= render "form" %>

经过多次初步混淆后,这对我有用。

祝好运!


2
投票

首先,你可以使用<%= form_for @post do |f| %>

其次,您的控制器需要引用@post。例如在new,它将是@post = Post.new


0
投票

尝试在控制器操作中创建模型:

控制器:

def new
  @post = Post.new
end

视图:

<%= form_for @post do |f| %>

还请发布生成的html。


0
投票

我不确定是什么修复了它。 @ titanboa - 该教程还没有涵盖生成模型,所以我继续在教程中继续,好像一切正​​常。生成模型后,它现在似乎工作正常。对于令人不满意的结论感到抱歉,但感谢所有的投入!


0
投票

您是否有可能使用Posts模型而不是Post模型 - 单数与复数?请检查模型的文件名(post.rb与posts.rb)以及该文件中的类名(Post vs. Posts)。

看起来'posts_path'解析为'posts / new'而不是'posts',因为从你的错误消息中我看到有一个POST'请求'posts / new',而提交表单应该会产生一个POST请求'/帖子。

也许还有其他原因'posts_path'表现得像那样,但我的第一个猜测是单数/复数。

编辑:现在我已经尝试重现这个问题,但是既没有改变关于单数/复数的模型也没有完全删除模型导致了我的相应行为。


0
投票

我有同样的问题,直到后来我发现我需要刷新,而不是单击返回按钮进入帖子/新页面。希望能帮助到你。


0
投票

我有同样的问题,我在另一个线程中找到了我的问题的答案。

Other thread on same issue.

我的问题是我在我的posts_controller文件中的私有函数下面有我的def show函数。私有关键字以下的任何内容显然也是私有的。


0
投票

我有同样的问题。我尝试了类似帖子的所有答案,但没有任何效果,包括上面的那些。

我甚至删除了应用程序并重复了这个过程并陷入了同样的问题。

经过多次挫折之后,我意识到它与text_area字段有关。在每种情况下,我都将网页中的随机文本复制到正在抛出错误的正文文本字段中。我知道这是因为我决定改为输入随机文字而瞧!它致力于提交。

一直没有错。自从Ruby text_area attribute has no limit以来,我想它必须与我正在复制的字符混淆背景中的代码,因为它将它不理解的内容转换为HTML,如此处所述。

这是我自己的特例,我认为我应该分享。

© www.soinside.com 2019 - 2024. All rights reserved.