"没有路线匹配[POST]"尽管我的路由文件中有资源

时间:2016-08-01 17:46:35

标签: ruby-on-rails

我正在创建一个Rails应用程序,我需要一个表单才能在我的一个视图中运行并将数据提交到表而不使用脚手架(就像我通常那样)。

现在,此评论表单将出现在blog文件夹中的一个视图中。它需要允许用户输入他们的注释,将其保存到表中,然后返回到同一页面。

虽然这是一个非常常见的错误,但我很困惑,因为我指定了两件看起来很关键的东西:在我的路径文件中为表单创建资源,其次,在我的控制器中使用create方法。

blog.html.erb 中,会发生以下表格:

<%= form_for :cements do |f| %>
            <div class="form-group">
                <div class="field">
                    <%= f.label :post %><br>
                    <%= f.text_area :post, class: "form-control" %>
                </div>
            </div>

            <h5 id="username">Username</h5>
            <div class="form-group">
                <div class="field">
                    <%= f.text_field :username, class: "form-control" %>
                </div>
            </div>

            <%= f.hidden_field :slug, :id => "hiddenPicker"%>

    <div class="actions">
        <%= f.submit "Save", class: "btn btn-success-outline" %>
    </div>
<% end %>

然后,在我的控制器中,我有一个创建方法,应该重定向回原始页面,如我所愿。

blogs_controller.rb

class BlogsController < ActionController::Base

    def index
        @posts = Post.order('updated_at DESC').all
        @comments = Cement.all
    end

    def blog
        @posts = Post.where(slug: params[:id]).all
        @comments = Cement.all
    end 

    def create
        @cements= Cement.new(story_params)
        @cements.save
        redirect_to(:back)
    end

    private

    def story_params
        params.require(:cements).permit(:username, :post, :slug)
    end

end

好消息:评论表单在视图中呈现。坏消息:当我提交时,我收到此错误:没有路由匹配[POST]&#34; / blog&#34;。

我的期望是这将是我的Routes文件的问题;但是,我已经有一个resources方法:

Rails.application.routes.draw做   资源:帖子   资源:水泥   资源:博客

命名约定与我的控制器文件相同,所以我很困惑为什么会发生这种错误。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

:cement不是一个只有symbol的对象,那么rails将如何确定POST形成的位置?如果您检查表单,则会将action表单视为/blog(当前页面网址)。

你应该做

<%= form_for :cements, url: cements_path do |f| %>

<%= form_for Cement.new do |f| %>

以上两者都会生成/cements的表单操作,该操作将提交到CementsController create操作,但我看到您要将其提交给BlogsController,因此请使用相应的路线(blogs_path)。您也可以在第二版中使用url