为什么我的 form_for :blog 指向 /blogs/new?

Why does my form_for :blog point to /blogs/new?

我正在经历 instance-variable-vs-symbol-in-ruby-on-rails-form-for 所以 post。

根据投票最多的答案

if you use symbol :post it creates

<form action="/posts" method="post">

if you use the instance @post

for @post = Post.new you will get

<form action="/posts/create" class="new_account" id="new_account" method="post">

但是当我查看呈现的 html 页面时

<form action="/blogs/new" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="&#x2713;" />
<input type="hidden" name="authenticity_token" 
......

对于

new.html.erb

<%=form_for :blog do |f|%>
<%= f.text_field :title%>
<%= f.text_field :content%>
<%= f.submit :button %>
<% end %>

这让我出错说

Routing Error
No route matches [POST] "/blogs/new"

为什么会出现路径不匹配?

form_for :blog 的 url 操作将是 url 呈现该表单

form_for "blog 的 url 动作基于该对象的路径(在路由中定义)与该对象的状态相结合

http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

When the model is represented by a string or symbol, as in the example above, if the :url option is not specified, by default the form will be sent back to the current url

您链接的答案相对较旧,我敢肯定不再准确了。

Rails 方法是使用实​​例变量。

然后您应该使用 <%= form_for @Blog.new do |f| =>。这应该呈现为

<form action="/blogs" method="post">

对于资源,您的表单对于 show.html.erbnew.html.erb 都应该是通用的。在这种情况下,您应该将表单分成部分 _form.html.erb,并用实例变量替换 :blog

_form.html.erb

<%=form_for @blog do |f|%>
  <%= f.text_field :title%>
  <%= f.text_field :content%>
  <%= f.submit :button %>
<% end %>

您的控制器操作应创建此实例变量:

博客控制器

def new
  @blog = Blog.new
end

def update
  @blog = Blog.find(params[:id])
end

最后,您的模板应该只调用部分

new.html.erb

render partial: :form

update.html.erb

render partial: :form