如何在控制器的操作中定义和实例变量@variable
可以从其视图中调用?
喜欢
class UsersControllers
def index
@whythiscolavery=User.all
end
end
现在在/views/users/index.html.haml中为什么变量@whythiscolavery
可以在控制器操作中定义的视图中直接访问?
在一次重要的采访中,这个查询让我失望了。
@whythiscolavery.each do
user.name
end
答案 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