问题 rails上的ruby中的实例变量与符号(form_for)


我是ruby on rails的新手,我正在使用mac osx上的2.3版本。 我正在尝试创建一个脚手架创建的相同功能,但我自己。 我创建了一个“post”控制器,视图和模型。 在后控制器中,我有以下内容:

class PostController < ApplicationController
  def index
  end

  def new
    @post = Post.new
  end
end

在new.html.erb中,我有以下内容:

<h1>New Post</h1>

<% form_for :post do |f| %>

    <%= f.text_field :title %>

<% end %>

我注意到在scaffold生成的代码中,使用实例变量@post作为form_for帮助器。如果传递符号,为什么他们在脚手架生成的表单中使用实例变量:form infor中的post执行完全相同的操作,而符号需要更改路由的配置?

非常感谢你, 尤瓦


3669
2018-06-05 17:52


起源



答案:


如果你使用符号:post it created

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

如果您使用实例@post

对于@post = Post.new你会得到的

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

对于@post = Post.find(1)你会得到的

<form action="/posts/update" class="edit_account" id="edit_account_1" method="post">
<input name="_method" type="hidden" value="put">

如果你有新的不同形式和你的编辑没什么大不了但是比你的新形式更好,你的编辑形式将是相同的或接近它

因此,如果您使用实例变量@post,您可以将所有表单代码放入_form并只调用partial,如果您传入新记录或现有记录,它将根据其处理其余部分


15
2018-06-05 18:07



非常感谢你。这清楚:) - Yuval Karmi
隐藏的_方法的重要性在于浏览器不支持put和delete方法,所以你必须让应用程序知道post方法是put还是delete,谢天谢地我们为我们处理这个问题。 - ErsatzRyan
您需要在新表单上使用@post,即使表单是分开的,您也需要它。否则,当您创建包含无效数据的新帖子并返回到具有验证错误的新表单时,它将不会填写您输入的信息。 - Sarah Mei


答案:


如果你使用符号:post it created

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

如果您使用实例@post

对于@post = Post.new你会得到的

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

对于@post = Post.find(1)你会得到的

<form action="/posts/update" class="edit_account" id="edit_account_1" method="post">
<input name="_method" type="hidden" value="put">

如果你有新的不同形式和你的编辑没什么大不了但是比你的新形式更好,你的编辑形式将是相同的或接近它

因此,如果您使用实例变量@post,您可以将所有表单代码放入_form并只调用partial,如果您传入新记录或现有记录,它将根据其处理其余部分


15
2018-06-05 18:07



非常感谢你。这清楚:) - Yuval Karmi
隐藏的_方法的重要性在于浏览器不支持put和delete方法,所以你必须让应用程序知道post方法是put还是delete,谢天谢地我们为我们处理这个问题。 - ErsatzRyan
您需要在新表单上使用@post,即使表单是分开的,您也需要它。否则,当您创建包含无效数据的新帖子并返回到具有验证错误的新表单时,它将不会填写您输入的信息。 - Sarah Mei


一个可能的原因是它使表单的代码创建一个新的帖子更类似于表单的代码来更新现有的帖子。


0
2018-06-05 17:58



谢谢您的回答 - Yuval Karmi