我正在创建一个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做 资源:帖子 资源:水泥 资源:博客
命名约定与我的控制器文件相同,所以我很困惑为什么会发生这种错误。有任何想法吗?
答案 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
。