9

我正在研究 ruby​​onrails.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

这是我的路线.rb:

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

rake routes 给出了这个:

    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 的窗口生成的内容:

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)

在我尝试逐字逐句的其他教程中,我也遇到了同样的错误。我错过了什么?

谢谢。

4

8 回答 8

4

我相信您的问题可能与此行有关:

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

将其更改为:

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

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

通过在文件夹中调用一个单独的文件,您应该具有相同的表单new和操作。edit_form.html.erb/views/posts

然后,在您的new意见edit中,您引用此表格:

<%= render "form" %>

在最初的困惑之后,这对我有用。

祝你好运!

于 2014-02-21T15:46:39.343 回答
2

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

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

于 2013-10-06T01:13:13.653 回答
0

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

控制器:

def new
  @post = Post.new
end

看法:

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

还请发布生成的html。

于 2013-10-06T09:23:47.263 回答
0

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

于 2013-12-10T07:26:46.827 回答
0

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

关于同一问题的其他线程。

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

于 2013-12-29T02:29:26.007 回答
0

我不确定是什么修复了它。@titanboa——本教程尚未涵盖生成模型,所以我继续学习本教程,好像一切正​​常。生成模型后,它现在似乎工作正常。很抱歉得出不令人满意的结论,但感谢您的所有意见!

于 2013-10-06T13:30:21.353 回答
0

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

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

'posts_path' 的行为可能还有其他原因,但我的第一个猜测是单数/复数。

编辑:现在我试图重现这个问题,但既没有改变关于单数/复数的模型,也没有完全删除模型,这对我来说是各自的行为。

于 2013-10-06T09:18:11.300 回答
0

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

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

在经历了很多挫折之后,我意识到这与text_area字段有关。在每种情况下,我都将网页中的随机文本复制到引发错误的正文文本字段中。我知道这一点是因为我决定输入随机文本,瞧!它适用于提交。

一直都没有错。由于Ruby text_area 属性没有限制,我想它必须与我正在复制的字符一起在后台弄乱代码,因为它将它不理解的内容转换为 HTML,如此处所述。

这是我自己的特殊情况,我认为我应该分享。

于 2018-05-30T17:54:06.317 回答