是否有任何Rails覆盖渲染上的控制器实例变量的情况:部分?

时间:2009-06-27 00:59:43

标签: ruby-on-rails partial renderpartial

是否存在Rails覆盖渲染上的控制器实例变量的任何情况:在模板中执行部分调用?例如,假设我们有:

控制器

def my_action
   @widget = Widget.find(params[:id])
end    

查看my_action.html.erb

Hi there.
<%= render :partial => 'my_helper' %>
That's it, that's all.

查看_my _ helper.html.erb

The id is <%= @widget.id.to_s %>.

在my_helper中使用@widget时,是否存在任何记录的情况(错误或设计)?我在应用程序中看到此行为,但无法追踪其来源。

一些注意事项:
 *该应用程序在Rails 2.1.1中运行  *虽然可以将本地分配给渲染:partial =&gt; my_helper电话,由于种种原因,本地人在这种情况下并不是很理想  *我花了大量时间筛选ActionController和ActionView,但无法隔离行为。

2 个答案:

答案 0 :(得分:2)

不,Rails不会覆盖部分中的实例变量。

可以这样想:视图可以访问控制器的所有实例变量,而部分是视图的一部分。

但是,可能存在在属于不同控制器的视图中使用共享部分的用例。在这种情况下,部分内的代码会变得混乱,因为您可能不希望在不同控制器的方法中保持实例变量的名称相同。在这种情况下,使用locals哈希是一个更好,更清晰的选择

答案 1 :(得分:1)

这是一个有点蹩脚的建议:如果可行,请尝试使用其他变量名称。

或者,还有旧的Pragmatic Programmer“tracer bullets”的想法:在控制器中创建一个虚拟变量,您可以在各种视图/片段中打印出来,以确保这些值的范围/生命周期真正符合您的预期因为它的唯一名称(或者你忘记写的代码)而不是“某事”踩到这个变量。

最后,你确实尝试过:

% find . -name '*rb*' | xargs grep -B 2 -A 2 -n '@widget'

或在应用程序中进行类似的代码搜索,对吗?请注意,如果您“冻结”rails版本,所有rails框架代码将嵌套在您的应用程序中,您也可以搜索它。