2014-02-18 44 views
0

確定...上面edgeguides碼 - 困惑特定錯誤

<%= 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幫手了...

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。隨時糾正我,如果我的編輯是錯誤的。

+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| %> 

我肯定的形式和殲變量反映的實例@article 如預期的所有字段將被填補。

在更復雜的路線中,我也使用了url參數。

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

但它只是更清楚,如果它走向方向嵌套路線。

0

儘管form_for:article和form_for @article都可以工作,但這隻意味着form_for方法可以從@article或:article收集所需的信息。這並不意味着符號和實例是可以互換的。