1

在学习 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

路线.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

类别.rb

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

新的.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"
4

2 回答 2

2

你应该有你的看法

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

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

@category方法使用对象来form_for计算表单 url。

如果您只传递Symbolform_for方法,而没有url明确指定,则会生成表单,其中 url 是当前 url。

于 2013-07-22T14:05:07.357 回答
1

虽然@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-07-22T14:15:47.643 回答