让我感到困惑的是,例如,如果我们在控制器中定义了一个方法index
,并且在index
内有一个实例变量@var
,我们可以访问@var
直接在index.html.erb中没有指定任何内容。那么控制器的视图部分是什么?视图中的html.erb文件可以访问控制器中的局部变量吗?
答案 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使用此约定来避免将视图(片段)结构反映到从控制器传递到视图的字段中。由于值以相对非结构化的方式从控制器传递到视图,因此我们可以灵活地重构视图,而不必对控制器进行太多更改。