edgeguides代码 - 对特定错误感到困惑

时间:2014-02-18 06:49:49

标签: ruby-on-rails

好的......

 <%= form_for :article, url: articles_path do |f| %>
   <% if @article.errors.any? %>
     <div id="error_explanation">
      <h2><%= pluralize(@article.errors.count, "error") %> prohibited
        this article from being saved:</h2>
     <ul>
       <% @article.errors.full_messages.each do |msg| %>
       <li><%= msg %></li>
      <% end %>
     </ul>
  </div>
   <% end %>
   <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 %>

<%= link_to 'Back', articles_path %>

好的,上面的代码来自http://edgeguides.rubyonrails.org/getting_started.html

问题与这部分有关:

<%= form_for :article, url: articles_path do |f| %>
   <% if @article.errors.any? %>

如果我在第一行中将:article更改为@article,它仍然有效。它应该,因为它们可以互换,是吗?

但如果我像这样更改第二个:

@article.errors.any?:article.errors.any?

它会产生错误,特别是:

undefined method 'errors' for :article:Symbol

为什么?

请保持温柔,因为我仍在努力想象你看起来很明显的事情。

在这里大声思考,符号不适用于第二行的原因是它需要一个实例来收集错误,对吧?

但是,那些符号是否可以与实例互换?这意味着Rails应该读取该行并将其转换为实例,即它找到模型类的实例,是吗?

修改

显然,我没有再读得太久了,而且我没有把我以前学过的关于form_for helper的内容铭记于心......

EdgeGuides在代码之后说这个:

The first parameter of the form_tag can be an object, say, @article which would cause the helper to fill in the form with the fields of the object. Passing in a symbol (:article) with the same name as the instance variable (@article) also automagically leads to the same behavior. This is what is happening here. More details can be found in form_for documentation.

关键是form_for帮助器。

这就是为什么它不适用于第二行...因为它无法弄清楚如何填写符号的位置。

希望这有助于其他一些穷人/女孩。

PS。如果我的编辑错误,请随时纠正我。

2 个答案:

答案 0 :(得分:0)

:article is only the model (not really sure :)
@article is an instance with data in it
   when Article.new empty, Article.find(..) with data

在我的应用程序中,我总是使用

<%= form_for @article do |f| %>

然后我确信表单和f变量反映了实例@article 并且所有字段都将按预期填写。

在更复杂的路线中,我也使用url参数。

<%= form_for :article, :url => articles_path do |f| %>

但是,如果它进入方向嵌套路线,那就更清楚了。

答案 1 :(得分:0)

尽管form_for:article和form_for @article都有效,但这只意味着form_for方法可以从@article或:article收集所需的信息。它并不意味着符号和实例是可以互换的。