为什么符号呢?

时间:2014-02-17 01:14:39

标签: ruby-on-rails ruby

尝试更多地分解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| %>

不,不要试图改变问题,或任何改变。我最初在写这篇文章的时候就已经假定,这两种方法都可行。但只是为了它,在阅读了回复之后,我尝试了@,并得到了这个错误。

那么,想知道发生了什么,或者它只是我?

1 个答案:

答案 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|