尝试更多地分解Rails代码,以便我能够理解发生了什么
<%= form_for :article do |f| %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :text %><br>
<%= f.text_area :text %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
此代码来自5.2的edgeguides部分:http://edgeguides.rubyonrails.org/getting_started.html
<%= form_for :article do |f| %>
那条线困扰着我。为什么它是一个符号而不是@article?
@article将是Article对象的一个实例,对吗?你不希望form_for吗?
PS。随意编辑标题以更好地反映这篇文章。
编辑 ...我理解为什么这篇文章被标记为重复,我很高兴让它成为现实。
然而,我只是发布了这个。我不知道这是我(即我的错误)还是我处理Rails 4的事实,但当我将它从符号(:article)更改为object(@article)时 - 刷新新页面时出现此错误。
这是错误:First argument in form cannot contain nil or be empty
为了澄清,这是我更改的行:
<%= form_for @article do |f| %>
不,不要试图改变问题,或任何改变。我最初在写这篇文章的时候就已经假定,这两种方法都可行。但只是为了它,在阅读了回复之后,我尝试了@,并得到了这个错误。
那么,想知道发生了什么,或者它只是我?
答案 0 :(得分:1)
是的,你的怀疑是正确的,但是你读得不够:
当你调用form_for时,你会为它传递一个识别对象 形成。在这种情况下,它是符号:文章。这告诉form_for 帮助这个形式是什么。在这个方法的块里面, FormBuilder对象 - 由f表示 - 用于构建两个标签 和两个文本字段,分别用于文章的标题和文本。 最后,在f对象上调用提交将创建一个提交按钮 表格。
但这种形式存在一个问题。如果您检查HTML 通过查看页面来源生成的,您将看到 表单的action属性指向/ articles / new。 这是一个问题,因为这条路线会转到您所在的页面 此时此刻,该路线应仅用于展示 新文章的形式。
表单需要使用不同的URL才能转到其他位置。 这可以通过form_for的:url选项完成。 通常在Rails中,用于新表单提交的操作 像这样称为“创建”,因此应该指出表单 那个动作。
TLDR
使用form_for(@article || Article.new) do |f|