好的......
<%= 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。如果我的编辑错误,请随时纠正我。
答案 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收集所需的信息。它并不意味着符号和实例是可以互换的。