【问题标题】:Rails 4 Routing Error - no rout matches [POST] "/categories/new"Rails 4 Routingerror - 没有路由匹配 [POST] "/categories/new"
【发布时间】:2013-07-22 14:03:12
【问题描述】:

在学习 Rails 4 时,我在尝试为我的简单博客的帖子添加类别时遇到了困难。我已经生成了模型,运行了迁移并添加了一个控制器。无论我现在在尝试创建类别时做什么,我都会遇到同样的错误:没有路由匹配 [POST],这很奇怪,因为我似乎已经准备好了所有代码。请帮忙!

类别控制器

class CategoriesController < ApplicationController

    def index
      @categories = Category.all
    end

    def new
      @category = Category.new
    end

    def create
      @category = Category.new(category_params)

        @category.save
        redirect_to new_category_path, alert: "Category created!"
    end

    def show
      @category = Category.find(params[:id])
    end

    def destroy
      @category = Category.find(params[:id])
      @category.destroy

      redirect_to categories_path
    end


  private
        def category_params
            params.require(:category).permit(:name)
        end

end

routes.rb

Blog::Application.routes.draw do
  get 'tags/:tag', to: 'posts#index', as: :tag

  resources :categories

  resources :posts do
    resources :comments
  end

  root 'welcome#index'
end

category.rb

class Category < ActiveRecord::Base
    validates :name, presence: true
    has_many :posts
end

new.html.erb

<%= form_for :category do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

/类别/新

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

【问题讨论】:

  • 你能添加整个回溯吗?

标签: ruby-on-rails ruby routing


【解决方案1】:

你应该在你的视野中

<%= form_for @category do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

@category 对象被 form_for 方法用于计算表单 url。

如果您只将Symbol 传递给form_for 方法,而没有明确指定url,则会以url 为当前url 生成表单。

【讨论】:

【解决方案2】:

虽然@category 有效,但如果您进一步阅读,您会发现他们会解释为什么您的代码会发送No route matches [POST] "/categories/new"

该指南实际上解释了您需要为表单指定url: posts_path 才能使用正确的路线。

不过,这种形式存在一个问题。如果您检查 HTML 即生成,通过查看页面的源码,你会看到 表单的 action 属性指向 /posts/new。这个 是一个问题,因为这条路线会转到您所在的页面 就在此刻,那条路线应该只用于显示 新帖子的表格。

表单需要使用不同的 URL 才能转到其他位置。 这可以通过 form_for 的 :url 选项非常简单地完成。 通常在 Rails 中,用于提交新表单的操作 像这样被称为“创建”,所以表单应该指向 那个动作。

编辑 app/views/posts/new.html.erb 中的 form_for 行以查看 像这样:

<%= form_for :post, url: posts_path do |f| %> 

在本例中, posts_path 助手被传递给 :url 选项。 Rails 会做什么 这是它会将表​​单指向 当前控制器,即 PostsController,并将发送一个 POST 请求 到那条路线。

【讨论】:

  • 谢谢大家。我想太多的信息会使我的大脑不堪重负。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多