我最近开始学习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。为什么会这样?为什么我们必须使用实例变量来遍历用户?
答案 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只是说“你在控制器中设置了任何实例变量,我们会将其复制并在你的视图中使用 - 这样你就不用担心了。”
有些人喜欢铁杆,其他人批评它。采取所有类型!