我正在浏览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。我错过了什么?
感谢。
答案 0 :(得分: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" %>
在最初的困惑之后,这对我有用。
祝你好运!答案 1 :(得分:2)
首先,您可以使用<%= form_for @post do |f| %>
。
其次,您的控制器需要引用@post
。例如,在new
中,它将是@post = Post.new
。
答案 2 :(得分:0)
你有可能有Posts模型而不是Post模型 - 单数与复数?请检查模型的文件名(post.rb与posts.rb)以及该文件中的类名(Post vs. Posts)。
看起来'posts_path'解析为'posts / new'而不是'posts',因为从错误消息中我看到有一个POST'请求'posts / new',而提交表单会导致POST请求到'/ posts'。
也许还有其他原因'posts_path'表现得像那样,但我的第一个猜测是单数/复数。
编辑:现在我已经尝试重现这个问题,但是既没有改变模型的单数/复数也没有完全删除模型导致了我的各自行为。
答案 3 :(得分:0)
尝试在控制器操作中创建模型:
控制器:
def new
@post = Post.new
end
查看:
<%= form_for @post do |f| %>
也请发布生成的html。
答案 4 :(得分:0)
我不确定修复它的原因。 @ titanboa - 该教程还没有涵盖生成模型,所以我继续在教程中继续,好像一切正常。生成模型后,它现在似乎工作正常。对于不满意的结论感到抱歉,但感谢所有的投入!
答案 5 :(得分:0)
我遇到了同样的问题,直到后来我发现我需要刷新,而不是单击“返回”按钮进入帖子/新页面。希望它有所帮助。
答案 6 :(得分:0)
我遇到了同样的问题,我在另一个帖子中找到了我的问题的答案。
我的问题是我在我的posts_controller文件中的私有函数下面有我的def show函数。私有关键字以下的任何内容显然都是私有的。
答案 7 :(得分:0)
我遇到了同样的问题。我尝试了类似帖子的所有答案,但没有任何效果,包括上面的那些。
我甚至删除了该应用并重复了该过程并陷入了同样的问题。
非常沮丧之后,我意识到这与 text_area 字段有关。在每种情况下,我都将网页中的随机文本复制到正在抛出错误的正文文本字段中。我知道这是因为我决定改为输入随机文字而瞧!它致力于提交。
一直没有错。自Ruby text_area attribute has no limit以来,我想它必须与我在复制背景中的代码混乱,因为它将它不理解的内容转换为HTML,如此处所述。
这是我自己的特例,我认为我应该分享。