如何在控制器的动作中定义的实例变量@variable可以从其视图中调用?

可以从视图中调用控制器操作中定义的变量和变量@variable吗?

喜欢

 class UsersControllers def index @whythiscolavery=User.all end end 

现在在/views/users/index.html.haml中,为什么变量@whythiscolavery可以在controllers动作中定义的视图中直接访问?

这个查询在重要的采访中让我失望了..

 @whythiscolavery.each do user.name end 

引用The Rails 3方式的Obie Fernandez:

Rails实现控制器到视图数据切换的方式是通过实例变量。 通常,控制器操作初始化一个或多个实例变量。 然后,视图可以使用这些实例变量。

在选择实例变量以在控制器和视图之间共享数据时,有一点讽刺(并且可能会对新手造成混淆)。 实例变量存在的主要原因是对象(无论是Controller对象,String对象等)是否可以保留不与其他对象共享的数据。 执行控制器操作时,所有操作都发生在控制器对象的上下文中 – 例如DemoController或EventController的实例。 上下文包括代码中的每个实例变量都属于控制器实例的事实。

呈现视图模板时,上下文是不同对象的上下文,即ActionView :: Base的实例。 该实例具有自己的实例变量,并且无权访问控制器对象的实例。

因此,从表面上看,实例变量是两个对象共享数据的最佳选择。 但是,有可能实现它 – 或者让它看起来发生。 Rails的作用是遍历控制器对象的变量,并为每个变量创建一个视图对象的实例变量,具有相同的名称并包含相同的数据。

对于框架来说,这是一种劳动密集型:这就像手工复制杂货清单一样。 但最终的结果是程序员对你来说更容易。 如果你是一个Ruby纯粹主义者,你可能会想到用于连接对象的实例变量,而不是将它们分开。 另一方面,作为Ruby纯粹主义者还应该包括理解你可以在Ruby中做很多不同的事情 – 比如在循环中复制实例变量。 所以没有什么真的不像Ruby那样。 从程序员的角度来看,它确实提供了一个无缝连接,在控制器和它呈现的模板之间。

视图基本上是控制器的方法,因此它们可以像普通的普通旧ruby类一样访问实例变量。 如果你上课了

 class Donut def show @delicious = "very very delicious" end private def render_show "donuts are #{@delicious}" end end Donut.new.show 

Erb(以及haml,js和所有其他渲染)以相同的方式处理。

因为在Ruby On Rails MVC架构和“约定优于配置”中 ,实例变量是跨越模型/视图/控制器和帮助器。

控制器中的方法是公共操作(除非它们受到保护)。 在该视图中可以使用该操作中分配的实例变量。

haml的语法是:

 -@whythiscolavery.each do |user| = user.name 

erb语法是

 <%= @whythiscolavery.each do |user| %> <%= user.name %> <% end %> 

如果你问如何从视图中访问变量,niiru的答案很好,除了erb语法示例中的额外’=’符号。 它应该是:

 <% @whythiscolavery.each do |user| %> <%= user.name %> <% end %> 

如果你问为什么变量在视图中可用 ,那是因为控制器使它们可用于视图(它们被复制到视图中)。 这个设计缺点(维护状态)促使创建了gem decent_exposure: https : //github.com/voxdolo/decent_exposure