简体   繁体   中英

No route matches [POST] "/articles/new"

When I try to submit the form its giving me the error

No route matches [POST] "/articles/new"

the files are: new.html.erb
this file which contains the form with a text field and text area:

<%= form_for :article, url: articles_path do |f| %>

here the url: is to match post request which is a create

form's title

<%= f.label :title %><br>

form's text field

<%= f.text_field :title %></p>

form's title

<%= f.label :text %><br>

form's text area

<%= f.text_area :text %></p>           
<p>
<%= f.submit %>
</p>
<% end %>

route file is

Rails.application.routes.draw do

resources :article
end

controller is the controller with its methods new and create

whenever I submit the form its giving the error, even I used the URL: articles_path which for default post request, I used @articles also in the form but it is giving me the same error. I am new to the Rails so I tried many ways but I could not find the solution

class ArticlesController < ApplicationController

  def new #new method which is a get request
  end

  def create #create method which is a post request
  end
end

whenever I submit the form its giving the error, even I used the url: articles_path which for default post request. and I kept

def create
end

in the controller

The reason why this occurs for many people using this tutorial is that they don't reload the form after changing the url option in the form_for helper.

Be sure to reload a fresh copy of the form before trying to submit it (you need the form to have the most recent form submission url).

change:

resources :article

to:

resources :articles #plural

that way it will map to:

articles_path    POST    /articles(.:format)     articles#create

I changed app/views/articles/new.html.erb from:

<%= form_for :article do |f| %>

to:

<%= form_for :article, url: articles_path do |f| %>

You can find the answer on the official guideline.

Because this route goes to the very page that you're on right at the moment, and that route should only be used to display the form for a new article.

Edit the form_with line inside app/views/articles/new.html.erb to look like this:

<%= form_with scope: :article, url: articles_path, local: true do |form| %>

Your actions/methods in the controller do nothing. It should be something like:

class ArticlesController < ApplicationController

  def new 
    @article = Article.new
  end

  def create 
    @article = Article.new(article_params)
    if @article.save
      redirect_to @article
    else
      render 'new'
    end
  end

 private

  def article_params
    params.require(:article).permit()# here go you parameters for an article
  end

end

In the view:

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

RedZagogulin s answer is right - that is the code you need to use in your articles controller

--

Routes

The clue to your problem is here:

No route matches [POST] "/articles/new"

Typically, when using the correct routing structure :

#config/routes.rb
resources :articles #-> needs to be controller name

You'll find that the new action is GET , not POST . This leads me to believe your system is set up incorrectly (it's trying to send the form data to articles/new , when it should just send to [POST] articles

在此处输入图片说明

If you follow the steps outlined by RedZagogulin , it should work for you

I was continually running into this problem and it came down to the fact that I had the following code in my navbar:

<%= link_to "Blog", controller: 'articles' %>

I switched to this and it all started working:

<%= link_to "Blog", articles_path %>

I'm still new to this so the different ways of doing things sometimes gets confusing.

In your case,
at first change the

#/config/routes.rb

resources :article

to

#/config/routes.rb

resources :articles #plural
# Changing this in Plural naming if your file name
# in #/app/view
# is plural
# (ex: /app/view/articles)
#
# and controller and it's class is also in plural naming
# (ex:
# in #/app/controllers/articles_controller.rb file
# class ArticlesController < ApplicationController
#
# end)

In some cases, we need to add a Post routes to make a Post Request of the form. Just add the lines in routes file:

#/config/routes.rb

Rails.application.routes.draw do

  resources :articles #plural
  post '/articles/new' => 'articles#create'

end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM