视图中的实例变量

时间:2015-12-02 12:41:08

标签: ruby-on-rails ruby

我最近开始学习Ruby on Rails,并且根据我在Ruby中学到的东西,遇到了让我困惑的东西。在The Rails Tutorial中,以下代码用于从Model中检索所有用户,并将其传递给视图:

class UsersController < ApplicationController
  .
  .
  .
  def index
    @users = User.all
  end
  .
  .
  .

在视图中:

<% @users.each do |user| %>
  <tr>
    <td><%= user.name %></td>
    <td><%= user.email %></td>

据我了解,如果没有访问器方法,实例变量就无法在其类外访问,但是View可以访问@users。为什么会这样?为什么我们必须使用实例变量来遍历用户?

2 个答案:

答案 0 :(得分:1)

所以,

Ruby on Rails是框架,其中约定优于配置规则非常重要。在幕后,Rails将正确的控制器操作与视图文件匹配,视图文件具有相同的名称,例如。 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>操作将与index匹配。

此特殊连接使Rails能够在视图实例变量中使用,这些变量在特定索引中设置。 正如您所见,实例变量index.html.erb在视图文件中可用,但任何其他变量都不可用。

答案 1 :(得分:1)

你是对的 - 你不能访问课外的实例变量。控制器中的@users实际上与视图中@users的实例变量不完全相同。实际上它是,但实际发生的是Rails,在幕后,将查看控制器中的所有实例变量,并将它们复制到您的视图中。这是一个方便的事情 - rails就是为了省你不必担心它。

值得注意的是,并非所有框架都采用这种方法。因此,在某些框架中,您必须明确说明要为视图提供哪个变量。如果rails执行此操作,则某些代码可能如下所示:

def index

  @users = User.all
  first_user = User.first

  set_for_view(first_user, :the_first_user)
end

只有set_for_view方法可以设置可在视图中使用的变量。因此,@users在视图中不可用(无论它是一个实例变量),同样地,first_user可用 - 并不重要它不是实例变量,只要它传递给set_for_view。在此示例中,first_user将在变量名称the_first_user下的视图中可用 - 因为这是我们在第二个参数中传递给set_for_view的名称。

作为一个框架,Rails选择'约定优于配置',并且做了很多魔术,以节省你必须编写这样的额外代码。 Rails只是说“你在控制器中设置了任何实例变量,我们会将其复制并在你的视图中使用 - 这样你就不用担心了。”

有些人喜欢铁杆,其他人批评它。采取所有类型!