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

时间:2012-04-05 19:54:28

标签: ruby-on-rails ruby-on-rails-3

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

喜欢

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

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

在一次重要的采访中,这个查询让我失望了。

@whythiscolavery.each do   
     user.name
 end

6 个答案:

答案 0 :(得分:4)

引用The Rails 3方式的Obie Fernandez:

  

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

     

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

     

渲染视图模板时,   上下文是一个不同的对象,一个实例   ::的ActionView基地。该实例有自己的实例变量,和   无法访问控制器对象的访问权限。

     

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

     

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

答案 1 :(得分:2)

视图基本上是控制器的方法,因此它们可以像普通的普通旧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和所有其他渲染)以相同的方式处理。

答案 2 :(得分:1)

因为在Ruby On Rails MVC architecture"convention over configuration"中,实例变量与模型/视图/控制器和助手交叉。

答案 3 :(得分:1)

控制器中的

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

答案 4 :(得分:0)

haml的语法是:

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

erb语法是

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

答案 5 :(得分:0)

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

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

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