ruby-on-rails 无路径匹配[POST]“/文章/新”

nimxete2  于 2023-02-26  发布在  Ruby
关注(0)|答案(9)|浏览(112)

当我尝试提交表单时,它给了我错误

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

这些文件是:new.html.erb
此文件包含带有文本字段和文本区域的表单:

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

这里的网址:是匹配创建的post请求
表格标题

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

窗体的文本字段

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

表格标题

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

窗体的文本区

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

路由文件是

Rails.application.routes.draw do

resources :article
end

控制器是具有新方法和创建方法的控制器
每当我提交表单时,它都会给出错误,甚至我使用了URL:articles_path,对于默认的post请求,我也在表单中使用了@articles,但是它给了我同样的错误。我是Rails的新手,所以我尝试了很多方法,但是我找不到解决方案

class ArticlesController < ApplicationController

  def new #new method which is a get request
  end

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

每当我提交的形式它给出的错误,甚至我使用的网址:articles_path默认的发布请求。我保留

def create
end

在控制器中

gr8qqesn

gr8qqesn1#

许多使用本教程的人之所以会出现这种情况,是因为他们在修改了form_for帮助器中的url选项后没有重新加载表单。
请确保在尝试提交表单之前重新加载表单的新副本(您需要表单具有最新的表单提交URL)。

rqmkfv5c

rqmkfv5c2#

变更:

resources :article

致:

resources :articles #plural

这样,它将Map为:

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

wvt8vs2t3#

我更改了应用程序/视图/文章/new. html. erb从:
<%= form_for :article do |f| %>
致:
<%= form_for :article, url: articles_path do |f| %>

olhwl3o2

olhwl3o24#

你可以在官方指南上找到答案。
因为这个路由会转到您当前所在的页面,并且该路由应该只用于显示新文章的表单。
编辑app/views/articles/new.html.erb中的form_with行,使其如下所示:

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

fzwojiic5#

控制器中的操作/方法什么也不做。它应该是这样的:

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

在视图中:

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

ee7vknir6#

RedZagogulin的答案是正确的-这就是您需要在articles控制器中使用的代码

    • 路线**

你的问题的线索在这里:

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

通常,使用正确的路由结构时:

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

您会发现new操作是GET,而不是POST,这使我认为您的系统设置不正确(它试图将表单数据发送到articles/new,而实际上它应该发送到[POST] articles

如果您遵循RedZagogulin概述的步骤,它应该可以为您工作

vmdwslir

vmdwslir7#

我不断遇到这个问题,它归结为一个事实,我有以下代码在我的导航栏:

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

我换了这个,一切都开始工作:

<%= link_to "Blog", articles_path %>

我对这方面还是新手,所以不同的做事方式有时会让我感到困惑。

zdwk9cvp

zdwk9cvp8#

就你而言,
首先更改

#/config/routes.rb

resources :article


x一个一个一个一个x一个一个二个x
在某些情况下,我们需要添加一个Post路由以生成表单的Post Request。只需在路由文件中添加以下行:

#/config/routes.rb

Rails.application.routes.draw do

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

end
pwuypxnk

pwuypxnk9#

为了让它工作,我需要合并两个答案的说明。首先,我在routes.rb中添加了一个特定的路由来处理对'/articles/new'的POST请求:

Rails.application.routes.draw do
  root "articles#index"

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

然后我不得不将表单的第一行更改为<%= form_with model: @aricle do |form| %>

<h1>New Article</h1>

<%= form_with model: @aricle do |form| %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>
 
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
 
  <p>
    <%= form.submit %>
  </p>
<% end %>

相关问题