【发布时间】:2013-09-13 05:09:40
【问题描述】:
我理解并欣赏通过将 @ 放在 Controller 中的变量名前面,它可以在加载的任何视图中使用。这非常有用,但我想了解它的魔力。它是如何发生的,可以阻止吗?
我正在尝试使用继承来干燥我的 CRUDdy 资源控制器,将大部分逻辑放在ApplicationController 中。超类应该引用抽象变量@resource(用于单个资源)、@resources(用于资源集合)和@parent_resource(用于嵌套@resource 时的父资源),但理想情况下是视图将获得更具体的名称,例如:@customer、@customers 和 @sales_territory。这可以在不将所有对象的副本(一次在抽象名称中,一次在具体名称中)发送到视图的情况下完成吗?
在我写这篇文章时,想到的可能性是:
- 受保护的实例变量...Ruby 有这样的东西吗? 如果是这样,控制器会魔法将它们交给视图吗?
- 在渲染/重定向之前将通用命名变量设置为 nil
- 使用子类中定义的受保护的空方法来代替 抽象命名实例变量
如何实现这一点的正确选择是什么?
【问题讨论】:
-
你想通过隐藏/阻止这些变量在视图中使用来实现什么?实例变量持有的对象不会在视图中“复制” - 通过调用已经设置的控制器的实例变量,视图可以简单地访问它们。
-
我实际上应该放一些代码来让事情更清楚,但我的目标是得到关于 Rails 中视图和控制器之间关系的内部运作的答案,而不是解决我的具体问题.在我的具体情况下,超类正在处理“@resource”,但“CustomersController”需要“@customer”才能进入视图。如果两者都存在,那么我的假设是它们都被发送,这将浪费资源。
标签: ruby-on-rails ruby