【问题标题】:Why symbol instead? [duplicate]为什么用符号代替? [复制]
【发布时间】:2014-02-17 01:14:38
【问题描述】:

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

此代码来自 edgeguides 的 5.2 部分:http://edgeguides.rubyonrails.org/getting_started.html

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

那条线困扰着我。为什么它是一个符号而不是@article?

@article 将是 Article 对象的一个​​实例,对吧?你不想要form_for吗?

ps。随意编辑标题以更好地反映这篇文章。

编辑 ...我理解为什么这篇文章被标记为重复,我可以让它保持原样。

但是,我只需要发布这个。我不知道这是我(即我的错误)还是我正在处理 Rails 4 的事实,但是当我将它从符号 (:article) 更改为对象 (@article) 时 - 我收到了这个错误当我刷新新页面时。

这是错误:First argument in form cannot contain nil or be empty

为了澄清,这是我更改的行:

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

不,不是试图改变问题,或任何其他的。当我写这篇文章时,我最初假设这两种方法都可以。但只是为了它,在阅读回复后,我尝试了@,并得到了那个错误。

那么,想知道发生了什么事,还是只有我一个人?

【问题讨论】:

  • +1 这是一个有效的问题,我可以说这是尝试理解 Rails 的认真尝试。但是,它可能会被 mods 标记为 dup。善于批判性地思考您的代码,而不仅仅是遵循惯例。
  • form_for 需要知道两件事:用于对象的“名称”(转换为字段名称的第一部分)和对象本身。如果您传递一个符号,帮助程序将尝试在同名的实例变量中查找实际对象。文档中的更多信息:api.rubyonrails.org/classes/ActionView/Helpers/…
  • @Powers 那些答案已经过时了
  • 大家好,很抱歉这么长时间才回复。不得不去某个地方,然后当我回到这个......必须处理所有的 cmets 并回答一下。还是有点糊涂。

标签: ruby-on-rails ruby


【解决方案1】:

是的,你的怀疑是正确的,但你没有读够:

当你调用 form_for 时,你传递给它一个标识对象 形式。在这种情况下,它是符号 :article。这告诉 form_for 帮手这个表格的用途。在此方法的块内, FormBuilder 对象 - 由 f 表示 - 用于构建两个标签 和两个文本字段,一个用于文章的标题和文本。 最后,在 f 对象上调用 submit 将创建一个提交按钮 表格。

不过,这种形式存在一个问题。如果您检查 HTML 即生成,通过查看页面的源码,你会看到 表单的 action 属性指向 /articles/new。 这是一个问题,因为这条路线会转到您所在的页面 目前就在右边,并且该路线仅应用于显示 新文章的表格。

表单需要使用不同的 URL 才能转到其他位置。 这可以通过 form_for 的 :url 选项非常简单地完成。 通常在 Rails 中,用于提交新表单的操作 像这样被称为“创建”,所以表单应该指向 那个动作。

TLDR

使用form_for(@article || Article.new) do |f|

【讨论】:

  • 嘿,谢谢你的回答。好的,请阅读您上面提到的来自指南链接的段落。我不明白它如何告诉 form_for 助手这个表单的用途。我的意思是,你不需要对象的属性吗?符号通过了吗?
  • 另外,尝试了你的线路。顺便说一句,它有效。所以感谢你给了我一种不同的尝试方式。我现在想了解的是这个||。那是 OR 运算符吗?所以,你的行本质上是对 form_for 说的是要么使用@article 对象,要么构建一个新的 Article 对象然后循环它,对吧?
  • 但也(对不起这么多 cmets!),请参阅我在上面的帖子中的编辑。我的理解是它们应该是可互换的符号与对象(是的,我明白了,不同的形式动作),而当我尝试放置符号时,它们似乎不是。任何想法为什么?
  • ,呃,在阅读了 MattJones 的评论并回复后才意识到,我的第一条评论是无效的,因为 form_for 会查找对象,如果使用了符号,对吧?属性就是这样传递的,对吧?
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多