【问题标题】:Instance Variables In The View视图中的实例变量
【发布时间】:2015-12-02 12:41:07
【问题描述】:

我最近开始学习 Ruby on Rails,根据我在 Ruby 中学到的知识,我遇到了一些让我感到困惑的事情。在 Rails 教程中,以下代码用于从模型中检索所有用户,并将其传递给视图:

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

在视图中:

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

我的理解是实例变量不能在没有访问器方法的情况下在其类之外访问,但这里视图可以访问@users。为什么呢?为什么我们必须使用实例变量来循环访问用户?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

所以,

Ruby on Rails 是框架,其中 约定优于配置 规则非常重要。在幕后,Rails 将适当的控制器操作与具有相同名称的视图文件相匹配,例如。 index 操作将与 index.html.erb 匹配。

这种特殊的连接使 Rails 可以在视图中使用实例变量,这些变量设置在特定的索引中。 如您所见,实例变量 @users 在视图文件中可用,但其他任何变量都不可用。

【讨论】:

    【解决方案2】:

    你是对的——你不能在类外访问实例变量。控制器中的 @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 只是说“您在控制器中设置的任何实例变量,我们都会将其复制并使其在您的视图中可用 - 这样您就不必担心它”。

    有些人喜欢 Rails,有些人则批评它。接受所有类型!

    【讨论】:

    • 请注意,如果您担心使用 ivars,也可以将局部变量显式传递给 Rails 中的视图。 render 'view', locals: {user: @user}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2013-01-16
    • 2016-07-22
    • 2013-08-23
    相关资源
    最近更新 更多