如何理解Rails中视图和控制器之间的关系?是视图控制器的一部分吗?

时间:2013-04-10 02:43:59

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

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

2 个答案:

答案 0 :(得分:1)

控制器是事件处理程序,它处理来自浏览器的传入请求,同时处理模型中的数据。控制器将处理来自用户交互的请求,即来自鼠标的键盘输入或点击事件。然后在视图中输出控制器的响应。因此,如果您想要UserController index行动index.html.erb,如果您想通过循环播放它们来访问这些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' }

希望这可以解决问题

答案 1 :(得分:0)

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