Ошибка маршрутизации Маршрут не соответствует [POST] /posts/new

Я работаю с «учебником по блогу» 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

Вот мои маршруты.rb:

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

rake route дает это:

    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)

Я получил эту же ошибку с другими учебниками, которым я пытался следовать дословно. Что мне не хватает?

Спасибо.


person user2053119    schedule 06.10.2013    source источник
comment
Можете ли вы опубликовать, что отображается в окне вашего терминала, где выполняется команда rails s server? Это должно быть более описательным, чем просто ошибка.   -  person Beartech    schedule 06.10.2013
comment
Попробуйте form_for Post.new do. Это должно решить проблему.   -  person Simon Ninon    schedule 06.10.2013
comment
@Simon Ninon -Спасибо за предложение. Я пробовал, но у меня все еще та же ошибка.   -  person user2053119    schedule 06.10.2013
comment
@Beartech написал выше.   -  person user2053119    schedule 06.10.2013


Ответы (8)


Я считаю, что ваша проблема может быть с этой строкой:

<%= 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" %>

Это сработало для меня после большого первоначального замешательства.

Удачи!

person Michael Giovanni Pumo    schedule 21.02.2014

Во-первых, вы можете просто использовать <%= form_for @post do |f| %>.

Во-вторых, ваш контроллер должен иметь ссылку на @post. Например, в new это будет @post = Post.new.

person Benjamin Tan Wei Hao    schedule 06.10.2013
comment
-Спасибо за предложение, однако я все еще получаю ту же ошибку. Я чувствую, что подобные ошибки возникали в других руководствах... может быть что-то не так с тем, как Rails добавляет новые маршруты? - person user2053119; 06.10.2013
comment
Ваши маршруты верны. У вас есть Post класс в post.rb? Вы выполнили все необходимые миграции? - person Benjamin Tan Wei Hao; 06.10.2013
comment
- Честно говоря, я не знаю о них. Это начало учебника, и в нем еще не рассмотрены миграции и не упоминается создание класса Post в post.rb. Приведенный выше код — это весь код, который был в учебнике. - person user2053119; 06.10.2013

Попробуйте создать модель в действии контроллера:

Контроллер:

def new
  @post = Post.new
end

Вид:

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

Также опубликуйте сгенерированный html, пожалуйста.

person freemanoid    schedule 06.10.2013

Я не уверен, что это исправило. @titanboa - в учебнике еще не было рассказано о создании моделей, поэтому я продолжал в учебнике, как будто все работало. После создания модели она теперь работает нормально. Извините за неудовлетворительный вывод, но спасибо за весь вклад!

person user2053119    schedule 06.10.2013

Возможно ли, что у вас есть модель Posts вместо модели Post - единственное число или множественное число? Пожалуйста, проверьте имя файла модели (post.rb или posts.rb) и имя класса в этом файле (Post или Posts).

Похоже, что «posts_path» разрешается в «posts/new» вместо «posts», поскольку из вашего сообщения об ошибке я вижу, что есть запрос POST на «posts/new», а отправка формы должна привести к запросу POST на «/ посты».

Возможно, есть и другие причины, по которым 'posts_path' ведет себя так, но мое первое предположение - единственное/множественное число.

Изменить: теперь я попытался воспроизвести проблему, но ни изменение модели в отношении единственного/множественного числа, ни полное удаление модели не привели к соответствующему поведению для меня.

person titanoboa    schedule 06.10.2013

У меня была та же проблема, пока позже я не узнал, что мне нужно Обновить, а не нажимать кнопку «Назад», чтобы перейти к сообщениям/новой странице. Надеюсь, поможет.

person Lucia    schedule 10.12.2013

У меня была такая же проблема, и я нашел ответ на свой вопрос в другой теме.

Другой поток по той же проблеме.

Моя проблема заключалась в том, что у меня была функция def show ниже частной функции в моем файле posts_controller. Все, что ниже ключевого слова private, также является частным.

person Justin    schedule 29.12.2013

У меня была такая же проблема. Я перепробовал все ответы на похожие посты, и ничего не получилось, включая приведенные выше.

Я даже удалил приложение, повторил процесс и застрял на той же проблеме.

После долгих разочарований я понял, что это связано с полем text_area. В каждом случае я копировал случайный текст с веб-страницы в поле основного текста, что вызывало ошибку. Я знал это, потому что вместо этого решил ввести случайный текст и вуаля! Это работало на подчинение.

Все это время не было ничего плохого. Поскольку атрибут Ruby text_area не имеет ограничений, я думаю, это должно быть связано с символами, которые я копировал, возясь с кодом в фоновом режиме, поскольку он преобразует то, что не понимает, в HTML, как указано здесь.

Это мой частный случай, и я подумал, что должен поделиться.

person Chidozie Nnachor    schedule 30.05.2018