【问题标题】:How to understand the relation between view and controller in Rails? Is view part of the controller?如何理解 Rails 中视图和控制器的关系?视图是控制器的一部分吗?
【发布时间】:2013-04-10 02:43:58
【问题描述】:

让我感到困惑的是,例如,如果我们在控制器中定义了一个方法index,并且在index 中有一个实例变量@var,我们可以直接在index.html.erb 中访问@var,而无需指定任何东西。那么视图是控制器的一部分吗?视图中的 html.erb 文件可以访问控制器中的局部变量吗?

【问题讨论】:

    标签: ruby-on-rails model-view-controller


    【解决方案1】:

    控制器是处理来自浏览器的传入请求同时处理模型中的数据的事件处理程序。控制器将处理来自用户交互的请求,即键盘输入或鼠标点击事件。然后在视图中输出控制器的响应。因此,如果您要在您的index.html.erb 中有一个index 操作的UserController,如果您想通过循环访问这些users,您将有某种类似的设置。

    控制器

    class UsersController < ApplicationController
    def index
       @users = User.all #Returns an array of all users
    
       respond_to do |format|
       format.html { render "users/_users", :locals => { :users=> @user } }} 
    
        end
    

    Index.html.erb

    <table>
      <thead>
      <tr>
        <th>Name</th>
      </tr>
      </thead>
      <tbody>
      <% @users.each do |user| %>
          <tr>
            <td> user.name</td>
          </tr>
      <% end %>
      </tbody>
    </table>
    

    更新:

    好的,我认为您的意思是发送一个局部变量并在视图中访问它。此外,众所周知,使用局部变量似乎是可取的,可以在应用程序范围内使用以避免依赖关系。因此,如果是这种情况,并且您想将局部变量传递给局部变量,您将使用:locals 来保持它的清洁。示例如下:

    render :partial => 'my_partial', :locals => { :some_variable => some_variable, :value=> 'value' }
    

    希望这能解决问题

    【讨论】:

    • 那么既然视图可以访问实例变量,那么它可以访问控制器中的局部变量吗?这是我问题的重点。 (我可能不善于表达我的问题。)
    【解决方案2】:

    在 Rails 中,视图是与控制器分开的对象。控制器在渲染视图时将其实例变量包含到视图的上下文中。您应该认为这是一种特殊的参数传递约定,而不是违反封装(访问控制器私有变量的视图)。 Rails 使用这个约定来避免将视图的(片段)结构反映到从控制器传递到视图的字段中。由于值以相对非结构化的方式从控制器传递到视图,因此我们可以灵活地重构视图,而不必对控制器造成太大的改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多