何时在 Rails 视图中使用 @ 以及何时使用符号?

Posted

技术标签:

【中文标题】何时在 Rails 视图中使用 @ 以及何时使用符号?【英文标题】:When to use @ in a Rails View and when to use a symbol? 【发布时间】:2010-10-24 16:46:04 【问题描述】:
  <% form_tag(:action=>'update', :id=>@album.id) do %>

  Title: <%= text_field(:album, :title)  %><br>
  Artist: <%= text_field(:album, :artist)  %><br>
  Genre: <%= text_field(:album, :genre)  %><br>
  Release Date: <%= datetime_select(:album, :release_date, :start_year=>1960) %><br>

  <%= submit_tag("Update") %>

  <% end %>

在上面的示例中,我不得不在 form_tag 中说 @album.id,但在 text_field 中我必须说:album。我一直在我的观点中混淆这些,并且从来不知道是使用@符号还是符号。是否有一个简单的规则可以明确何时使用什么?

【问题讨论】:

【参考方案1】:

我将暂时离开这里,但请耐心等待。

首先,我建议您使用RESTful routing,因为这可以让您访问一些Rails 更好的方法和操作,例如能够:

form_for(@album) do |f|

并根据该对象的#new_record? 状态确定您想去的地方。

其次,有了新的form_for,您可以通过以下方式来干掉您的观点:

<%= f.text_field :title %>

代替:

<%= text_field :album, :title %>

最后解释一下为什么在 Rails 中定义变量之前要加上 @ 符号,也称为“实例变量”:

当你在 Rails 中定义一个实例变量时,它在该实例中可用于整个请求,其中“实例”是 ActionControllerActionView 方法链,它们被调用以执行所有渲染等等你。将其定义为实例变量将使其在您的控制器、您在控制器中定义它后调用的任何方法、您的助手、您的视图以及从您的控制器、助手或视图呈现的部分中可用。

基本上,它在整个请求中都存在,但在您的模型中无法访问。

其他变量规范是类变量 (@@some_useful_thing = 1) 和全局变量 ($some_other_useful_thing = 1) 和常量 (ALL_IN_UP_CASE = 1)。

【讨论】:

谢谢。我必须研究 REST。在 Rails 1.1.6 上编写一些教程,但还没有完成。因此,对于 form_for,text_field(:album, :title) 不是必需的,因为 :album 名称是已知的,因为 f.text_field 是您使用 do |f| 引用的表单的一部分。我想我明白了。谢谢。【参考方案2】:

变量名前的@符号指的是当前类中的一个实例变量。 :(冒号)前缀创建一个符号。在您的示例中,@album.id@album 实例变量的 id 发送到form_tag,允许form_tag 从数据库中读取该对象并使用该对象中的适当数据填充表单字段。您在text_field 方法中传递的符号是form_tag 用来访问它从数据库创建的对象的特定属性的符号。然后它将这些属性的值放入它生成的文本字段中。

【讨论】:

所以 text_field 不知道专辑只是因为它包含在 form_tag 中,而 form_tag 已经引用了它。正如雷达所说, form_for 将是这种重复的解决方案。我想我现在明白这一点了。谢谢你的解释。

以上是关于何时在 Rails 视图中使用 @ 以及何时使用符号?的主要内容,如果未能解决你的问题,请参考以下文章

何时(何时不)运行 `sanitize` 方法?

何时在 Ruby on Rails 中使用 memoization

何时使用 Helpers 而不是 Partials

如何知道 youtube 视频何时开始播放以及何时在 ios 的 web 视图中按下 mpmovieplayer 的完成按钮

何时使用 viewDidLoad 以及何时使用 awakeFromNib

何时使用 Storyboard 以及何时使用 XIB