使用ROR提交表单时获取路由错误

时间:2016-06-04 09:37:47

标签: ruby forms ruby-on-rails-4

我需要一个帮助。使用ROR发布表单数据时出现以下错误。

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

Rails.root: C:/Sites/blog
Application Trace | Framework Trace | Full Trace

Routes

Routes match in priority from top to bottom
Helper  HTTP Verb   Path    Controller#Action
Path / Url          
articles_path   GET     /articles(.:format)     articles#index
    POST    /articles(.:format)     articles#create
new_article_path    GET     /articles/new(.:format)     articles#new
edit_article_path   GET     /articles/:id/edit(.:format)    articles#edit
article_path    GET     /articles/:id(.:format)     articles#show
    PATCH   /articles/:id(.:format)     articles#up

我正在解释下面的代码。

  

new.html.erb:

<%= form_for @article 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 %>

date 

当用户提交此表单时,会出现这类错误。我的route.rb文件位于下方。

Rails.application.routes.draw do
  resources :articles
  root 'welcome#index'
end

我的控制器文件代码如下所示。

class ArticlesController < ApplicationController
    def new

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

我使用的是Rails版本4.2...。请帮我解决此错误。

2 个答案:

答案 0 :(得分:0)

默认的Rails new操作为GET /articles/new,但默认的create操作为POST /articles(最后没有/new);您的表单会以某种方式提交到错误的网址。

为了快速重新创建此场景,我将以下内容输入终端:

rails new blog
cd blog
rails generate scaffold articles
rake db:migrate
rails s

...使用以下def new方法创建了一个Articles控制器:

# GET /articles/new
def new
  @article = Article.new
end

我在浏览器中导航到http://127.0.0.1:3000/articles,然后点击&#34;新文章&#34;然后&#34;创建文章&#34 ;;没有发生错误。

但是,从@article = Article.new删除def new行(以匹配您问题中的控制器代码)会导致以下错误出现在&#34;新文章&#34;页:

ArgumentError in Articles#new

First argument in form cannot contain nil or be empty

Extracted source (around line #1): <%= form_for(@article) do |f| %>

我不确定你是如何设法远远看到No route matches [POST] "/articles/new"消息的,但我想象缺少的@article = Article.new行与它有关。

答案 1 :(得分:-1)

您可以通过添加:

来实现此目的
def new
  @article = Article.new
end